mirror of
https://code.semirocket.science/wrapsix
synced 2024-11-08 15:21:00 +02:00
A bit of formal code cleaning
Mostly lines breaking, then also comments
This commit is contained in:
parent
746712c6de
commit
378d3200c2
27
src/arp.h
27
src/arp.h
@ -1,6 +1,6 @@
|
|||||||
/*
|
/*
|
||||||
* WrapSix
|
* WrapSix
|
||||||
* Copyright (C) 2008-2012 Michal Zima <xhire@mujmalysvet.cz>
|
* Copyright (C) 2008-2013 Michal Zima <xhire@mujmalysvet.cz>
|
||||||
*
|
*
|
||||||
* This program is free software: you can redistribute it and/or modify
|
* This program is free software: you can redistribute it and/or modify
|
||||||
* it under the terms of the GNU General Public License as published by
|
* it under the terms of the GNU General Public License as published by
|
||||||
@ -30,16 +30,21 @@
|
|||||||
|
|
||||||
/* ARP structure */
|
/* ARP structure */
|
||||||
struct s_arp {
|
struct s_arp {
|
||||||
unsigned short hw; /* 16 b; hardware type [0x0001] */
|
unsigned short hw; /* 16 b; hardware type
|
||||||
unsigned short proto; /* 16 b; protocol type [0x0800] */
|
[0x0001] */
|
||||||
unsigned char hw_len; /* 8 b; length of hardware address in bytes [0x06] */
|
unsigned short proto; /* 16 b; protocol type
|
||||||
unsigned char proto_len; /* 8 b; length of protocol address in bytes [0x04] */
|
[0x0800] */
|
||||||
unsigned short opcode; /* 16 b; operation code: [0x0001] or [0x0002] */
|
unsigned char hw_len; /* 8 b; length of hardware
|
||||||
struct s_mac_addr mac_src; /* 48 b; sender hardware address */
|
addr in bytes [0x06] */
|
||||||
struct s_ipv4_addr ip_src; /* 32 b; sender protocol address */
|
unsigned char proto_len; /* 8 b; length of protocol
|
||||||
struct s_mac_addr mac_dest; /* 48 b; target hardware address */
|
addr in bytes [0x04] */
|
||||||
struct s_ipv4_addr ip_dest; /* 32 b; target protocol address */
|
unsigned short opcode; /* 16 b; operation code:
|
||||||
}__attribute__((__packed__));
|
[0x0001] or [0x0002] */
|
||||||
|
struct s_mac_addr mac_src; /* 48 b; sender hardware addr */
|
||||||
|
struct s_ipv4_addr ip_src; /* 32 b; sender protocol addr */
|
||||||
|
struct s_mac_addr mac_dest; /* 48 b; target hardware addr */
|
||||||
|
struct s_ipv4_addr ip_dest; /* 32 b; target protocol addr */
|
||||||
|
} __attribute__ ((__packed__));
|
||||||
|
|
||||||
int arp(struct s_ethernet *ethq, char *payload);
|
int arp(struct s_ethernet *ethq, char *payload);
|
||||||
|
|
||||||
|
@ -1,6 +1,6 @@
|
|||||||
/*
|
/*
|
||||||
* WrapSix
|
* WrapSix
|
||||||
* Copyright (C) 2008-2012 Michal Zima <xhire@mujmalysvet.cz>
|
* Copyright (C) 2008-2013 Michal Zima <xhire@mujmalysvet.cz>
|
||||||
*
|
*
|
||||||
* This program is free software: you can redistribute it and/or modify
|
* This program is free software: you can redistribute it and/or modify
|
||||||
* it under the terms of the GNU General Public License as published by
|
* it under the terms of the GNU General Public License as published by
|
||||||
@ -26,7 +26,7 @@
|
|||||||
#include "log.h"
|
#include "log.h"
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* General checksum computation function
|
* General checksum computation function.
|
||||||
*
|
*
|
||||||
* @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)
|
||||||
@ -108,7 +108,7 @@ unsigned short checksum_update(unsigned short old_sum,
|
|||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* IPv4 checksum computation function
|
* IPv4 checksum computation function.
|
||||||
*
|
*
|
||||||
* @param ip_src Source IPv4 address
|
* @param ip_src Source IPv4 address
|
||||||
* @param ip_dest Destination IPv4 address
|
* @param ip_dest Destination IPv4 address
|
||||||
@ -150,7 +150,7 @@ unsigned short checksum_ipv4(struct s_ipv4_addr ip_src,
|
|||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* IPv6 checksum computation function
|
* IPv6 checksum computation function.
|
||||||
*
|
*
|
||||||
* @param ip_src Source IPv6 address
|
* @param ip_src Source IPv6 address
|
||||||
* @param ip_dest Destionation IPv6 address
|
* @param ip_dest Destionation IPv6 address
|
||||||
@ -192,7 +192,7 @@ unsigned short checksum_ipv6(struct s_ipv6_addr ip_src,
|
|||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* IPv4 checksum update computation function
|
* IPv4 checksum update computation function.
|
||||||
*
|
*
|
||||||
* @param old_sum Old checksum
|
* @param old_sum Old checksum
|
||||||
* @param ip6_src Original source IPv6 address
|
* @param ip6_src Original source IPv6 address
|
||||||
@ -231,7 +231,7 @@ unsigned short checksum_ipv4_update(unsigned short old_sum,
|
|||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* IPv6 checksum update computation function
|
* IPv6 checksum update computation function.
|
||||||
*
|
*
|
||||||
* @param old_sum Old checksum
|
* @param old_sum Old checksum
|
||||||
* @param ip4_src Original source IPv4 address
|
* @param ip4_src Original source IPv4 address
|
||||||
|
@ -30,7 +30,8 @@ struct s_mac_addr {
|
|||||||
|
|
||||||
/* Ethernet header structure */
|
/* Ethernet header structure */
|
||||||
struct s_ethernet {
|
struct s_ethernet {
|
||||||
struct s_mac_addr dest; /* 48 b; destination host (MAC) address */
|
struct s_mac_addr dest; /* 48 b; destination host (MAC)
|
||||||
|
address */
|
||||||
struct s_mac_addr src; /* 48 b; source host (MAC) address */
|
struct s_mac_addr src; /* 48 b; source host (MAC) address */
|
||||||
unsigned short type; /* 16 b; IP/ARP/RARP/... */
|
unsigned short type; /* 16 b; IP/ARP/RARP/... */
|
||||||
} __attribute__ ((__packed__));
|
} __attribute__ ((__packed__));
|
||||||
|
@ -1,6 +1,6 @@
|
|||||||
/*
|
/*
|
||||||
* WrapSix
|
* WrapSix
|
||||||
* Copyright (C) 2008-2012 Michal Zima <xhire@mujmalysvet.cz>
|
* Copyright (C) 2008-2013 Michal Zima <xhire@mujmalysvet.cz>
|
||||||
*
|
*
|
||||||
* This program is free software: you can redistribute it and/or modify
|
* This program is free software: you can redistribute it and/or modify
|
||||||
* it under the terms of the GNU General Public License as published by
|
* it under the terms of the GNU General Public License as published by
|
||||||
@ -60,7 +60,8 @@ struct s_ipv4_pseudo {
|
|||||||
struct s_ipv4_pseudo_delta {
|
struct s_ipv4_pseudo_delta {
|
||||||
struct s_ipv4_addr ip_src; /* 32 b; source address */
|
struct s_ipv4_addr ip_src; /* 32 b; source address */
|
||||||
struct s_ipv4_addr ip_dest; /* 32 b; destination address */
|
struct s_ipv4_addr ip_dest; /* 32 b; destination address */
|
||||||
unsigned short port; /* 16 b; transport layer address */
|
unsigned short port; /* 16 b; transport layer
|
||||||
|
address */
|
||||||
} __attribute__ ((__packed__));
|
} __attribute__ ((__packed__));
|
||||||
|
|
||||||
int ipv4(struct s_ethernet *eth, char *packet);
|
int ipv4(struct s_ethernet *eth, char *packet);
|
||||||
|
@ -1,6 +1,6 @@
|
|||||||
/*
|
/*
|
||||||
* WrapSix
|
* WrapSix
|
||||||
* Copyright (C) 2008-2012 Michal Zima <xhire@mujmalysvet.cz>
|
* Copyright (C) 2008-2013 Michal Zima <xhire@mujmalysvet.cz>
|
||||||
*
|
*
|
||||||
* This program is free software: you can redistribute it and/or modify
|
* This program is free software: you can redistribute it and/or modify
|
||||||
* it under the terms of the GNU General Public License as published by
|
* it under the terms of the GNU General Public License as published by
|
||||||
@ -64,7 +64,8 @@ struct s_ipv6_pseudo {
|
|||||||
struct s_ipv6_pseudo_delta {
|
struct s_ipv6_pseudo_delta {
|
||||||
struct s_ipv6_addr ip_src; /* 128 b; source address */
|
struct s_ipv6_addr ip_src; /* 128 b; source address */
|
||||||
struct s_ipv6_addr ip_dest; /* 128 b; destination address */
|
struct s_ipv6_addr ip_dest; /* 128 b; destination address */
|
||||||
unsigned short port; /* 16 b; transport layer address */
|
unsigned short port; /* 16 b; transport layer
|
||||||
|
address */
|
||||||
} __attribute__ ((__packed__));
|
} __attribute__ ((__packed__));
|
||||||
|
|
||||||
int ipv6(struct s_ethernet *eth, char *packet);
|
int ipv6(struct s_ethernet *eth, char *packet);
|
||||||
|
@ -1,6 +1,6 @@
|
|||||||
/*
|
/*
|
||||||
* WrapSix
|
* WrapSix
|
||||||
* Copyright (C) 2008-2012 Michal Zima <xhire@mujmalysvet.cz>
|
* Copyright (C) 2008-2013 Michal Zima <xhire@mujmalysvet.cz>
|
||||||
*
|
*
|
||||||
* This program is free software: you can redistribute it and/or modify
|
* This program is free software: you can redistribute it and/or modify
|
||||||
* it under the terms of the GNU General Public License as published by
|
* it under the terms of the GNU General Public License as published by
|
||||||
@ -230,6 +230,7 @@ struct s_nat *nat_in(radixtree_t *nat_proto4, struct s_ipv4_addr ipv4_src,
|
|||||||
* Retrieve or create data structure via fragment identification.
|
* Retrieve or create data structure via fragment identification.
|
||||||
*
|
*
|
||||||
* @param nat_proto4 Radix tree of fragments
|
* @param nat_proto4 Radix tree of fragments
|
||||||
|
* @param nat_timeout Linked list in which to watch for timeout
|
||||||
* @param ipv4_src Source IPv4 address
|
* @param ipv4_src Source IPv4 address
|
||||||
* @param id Fragment identification
|
* @param id Fragment identification
|
||||||
*
|
*
|
||||||
|
@ -1,6 +1,6 @@
|
|||||||
/*
|
/*
|
||||||
* WrapSix
|
* WrapSix
|
||||||
* Copyright (C) 2008-2012 Michal Zima <xhire@mujmalysvet.cz>
|
* Copyright (C) 2008-2013 Michal Zima <xhire@mujmalysvet.cz>
|
||||||
*
|
*
|
||||||
* This program is free software: you can redistribute it and/or modify
|
* This program is free software: you can redistribute it and/or modify
|
||||||
* it under the terms of the GNU General Public License as published by
|
* it under the terms of the GNU General Public License as published by
|
||||||
@ -25,7 +25,7 @@
|
|||||||
/**
|
/**
|
||||||
* Creates root of radix tree.
|
* Creates root of radix tree.
|
||||||
*
|
*
|
||||||
* @return Root of new radix tree
|
* @return Root of new radix tree
|
||||||
*/
|
*/
|
||||||
radixtree_t *radixtree_create(void)
|
radixtree_t *radixtree_create(void)
|
||||||
{
|
{
|
||||||
@ -44,8 +44,8 @@ radixtree_t *radixtree_create(void)
|
|||||||
/**
|
/**
|
||||||
* Destroys a radix tree.
|
* Destroys a radix tree.
|
||||||
*
|
*
|
||||||
* @param root Root of the tree to destroy
|
* @param root Root of the tree to destroy
|
||||||
* @param depth Depth of the tree
|
* @param depth Depth of the tree
|
||||||
*/
|
*/
|
||||||
void radixtree_destroy(radixtree_t *root, unsigned char depth)
|
void radixtree_destroy(radixtree_t *root, unsigned char depth)
|
||||||
{
|
{
|
||||||
@ -65,14 +65,16 @@ void radixtree_destroy(radixtree_t *root, unsigned char depth)
|
|||||||
/**
|
/**
|
||||||
* Inserts new data entry into the tree.
|
* Inserts new data entry into the tree.
|
||||||
*
|
*
|
||||||
* @param root Root of the radix tree
|
* @param root Root of the radix tree
|
||||||
* @param chunker Function to use to get chunks for indexing internal array
|
* @param chunker Function to use to get chunks for indexing
|
||||||
* @param search_data Key used to search in the tree
|
* internal array
|
||||||
* @param size Length of the key
|
* @param search_data Key used to search in the tree
|
||||||
* @param data Data to store in the tree
|
* @param size Length of the key
|
||||||
|
* @param data Data to store in the tree
|
||||||
*/
|
*/
|
||||||
void radixtree_insert(radixtree_t *root,
|
void radixtree_insert(radixtree_t *root,
|
||||||
unsigned char *(chunker)(void *data, unsigned char size, unsigned char *count),
|
unsigned char *(chunker)(void *data, unsigned char size,
|
||||||
|
unsigned char *count),
|
||||||
void *search_data, unsigned char size, void *data)
|
void *search_data, unsigned char size, void *data)
|
||||||
{
|
{
|
||||||
radixtree_t *tmp;
|
radixtree_t *tmp;
|
||||||
@ -109,13 +111,15 @@ void radixtree_insert(radixtree_t *root,
|
|||||||
/**
|
/**
|
||||||
* Deletes an entry from the tree.
|
* Deletes an entry from the tree.
|
||||||
*
|
*
|
||||||
* @param root Root of the radix tree
|
* @param root Root of the radix tree
|
||||||
* @param chunker Function to use to get chunks for indexing internal array
|
* @param chunker Function to use to get chunks for indexing
|
||||||
* @param data Key used to search in the tree
|
* internal array
|
||||||
* @param size Length of the key
|
* @param data Key used to search in the tree
|
||||||
|
* @param size Length of the key
|
||||||
*/
|
*/
|
||||||
void radixtree_delete(radixtree_t *root,
|
void radixtree_delete(radixtree_t *root,
|
||||||
unsigned char *(chunker)(void *data, unsigned char size, unsigned char *count),
|
unsigned char *(chunker)(void *data, unsigned char size,
|
||||||
|
unsigned char *count),
|
||||||
void *data, unsigned char size)
|
void *data, unsigned char size)
|
||||||
{
|
{
|
||||||
radixtree_t *tmp,
|
radixtree_t *tmp,
|
||||||
@ -126,7 +130,8 @@ void radixtree_delete(radixtree_t *root,
|
|||||||
|
|
||||||
chunks = chunker(data, size, &chunk_count);
|
chunks = chunker(data, size, &chunk_count);
|
||||||
|
|
||||||
for (i = 0, tmp = root; i < chunk_count && tmp != NULL; tmp = tmp->array[chunks[i++]]) {
|
for (i = 0, tmp = root; i < chunk_count && tmp != NULL;
|
||||||
|
tmp = tmp->array[chunks[i++]]) {
|
||||||
flags = tmp->count == 1 ? flags | (0x1 << i) : 0;
|
flags = tmp->count == 1 ? flags | (0x1 << i) : 0;
|
||||||
|
|
||||||
if (i + 1 == chunk_count) {
|
if (i + 1 == chunk_count) {
|
||||||
@ -160,13 +165,15 @@ void radixtree_delete(radixtree_t *root,
|
|||||||
/**
|
/**
|
||||||
* Lookups an entry in the tree.
|
* Lookups an entry in the tree.
|
||||||
*
|
*
|
||||||
* @param root Root of the radix tree
|
* @param root Root of the radix tree
|
||||||
* @param chunker Function to use to get chunks for indexing internal array
|
* @param chunker Function to use to get chunks for indexing
|
||||||
* @param data Key used to search in the tree
|
* internal array
|
||||||
* @param size Length of the key
|
* @param data Key used to search in the tree
|
||||||
|
* @param size Length of the key
|
||||||
*/
|
*/
|
||||||
void *radixtree_lookup(radixtree_t *root,
|
void *radixtree_lookup(radixtree_t *root,
|
||||||
unsigned char *(chunker)(void *data, unsigned char size, unsigned char *count),
|
unsigned char *(chunker)(void *data, unsigned char size,
|
||||||
|
unsigned char *count),
|
||||||
void *data, unsigned char size)
|
void *data, unsigned char size)
|
||||||
{
|
{
|
||||||
radixtree_t *tmp;
|
radixtree_t *tmp;
|
||||||
@ -210,7 +217,8 @@ void *radixtree_lookup(radixtree_t *root,
|
|||||||
*
|
*
|
||||||
* @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)
|
||||||
{
|
{
|
||||||
short i;
|
short i;
|
||||||
unsigned char counter;
|
unsigned char counter;
|
||||||
@ -220,7 +228,8 @@ unsigned char *radixtree_chunker(void *data, unsigned char size, unsigned char *
|
|||||||
counter = size * 8 / 6;
|
counter = size * 8 / 6;
|
||||||
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) {
|
||||||
log_error("Lack of free memory");
|
log_error("Lack of free memory");
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
@ -238,9 +247,11 @@ unsigned char *radixtree_chunker(void *data, unsigned char size, unsigned char *
|
|||||||
/* processes 3 bytes at a time */
|
/* processes 3 bytes at a time */
|
||||||
for (i = 0, counter = 0; counter < *count; i++) {
|
for (i = 0, counter = 0; counter < *count; i++) {
|
||||||
chunks[counter++] = cdata[i] & 0x3f;
|
chunks[counter++] = cdata[i] & 0x3f;
|
||||||
chunks[counter++] = ((cdata[i] & 0xc0) >> 6) | ((cdata[i + 1] & 0x0f) << 2);
|
chunks[counter++] = ((cdata[i] & 0xc0) >> 6) |
|
||||||
|
((cdata[i + 1] & 0x0f) << 2);
|
||||||
i++;
|
i++;
|
||||||
chunks[counter++] = ((cdata[i] & 0xf0) >> 4) | ((cdata[i + 1] & 0x03) << 4);
|
chunks[counter++] = ((cdata[i] & 0xf0) >> 4) |
|
||||||
|
((cdata[i + 1] & 0x03) << 4);
|
||||||
i++;
|
i++;
|
||||||
chunks[counter++] = ((cdata[i] & 0xfc) >> 2);
|
chunks[counter++] = ((cdata[i] & 0xfc) >> 2);
|
||||||
}
|
}
|
||||||
|
@ -1,6 +1,6 @@
|
|||||||
/*
|
/*
|
||||||
* WrapSix
|
* WrapSix
|
||||||
* Copyright (C) 2008-2012 Michal Zima <xhire@mujmalysvet.cz>
|
* Copyright (C) 2008-2013 Michal Zima <xhire@mujmalysvet.cz>
|
||||||
*
|
*
|
||||||
* This program is free software: you can redistribute it and/or modify
|
* This program is free software: you can redistribute it and/or modify
|
||||||
* it under the terms of the GNU General Public License as published by
|
* it under the terms of the GNU General Public License as published by
|
||||||
@ -30,14 +30,18 @@ typedef struct radixtree {
|
|||||||
radixtree_t *radixtree_create(void);
|
radixtree_t *radixtree_create(void);
|
||||||
void radixtree_destroy(radixtree_t *root, unsigned char depth);
|
void radixtree_destroy(radixtree_t *root, unsigned char depth);
|
||||||
void radixtree_insert(radixtree_t *root,
|
void radixtree_insert(radixtree_t *root,
|
||||||
unsigned char *(chunker)(void *data, unsigned char size, unsigned char *count),
|
unsigned char *(chunker)(void *data, unsigned char size,
|
||||||
|
unsigned char *count),
|
||||||
void *search_data, unsigned char size, void *data);
|
void *search_data, unsigned char size, void *data);
|
||||||
void radixtree_delete(radixtree_t *root,
|
void radixtree_delete(radixtree_t *root,
|
||||||
unsigned char *(chunker)(void *data, unsigned char size, unsigned char *count),
|
unsigned char *(chunker)(void *data, unsigned char size,
|
||||||
|
unsigned char *count),
|
||||||
void *data, unsigned char size);
|
void *data, unsigned char size);
|
||||||
void *radixtree_lookup(radixtree_t *root,
|
void *radixtree_lookup(radixtree_t *root,
|
||||||
unsigned char *(chunker)(void *data, unsigned char size, unsigned char *count),
|
unsigned char *(chunker)(void *data, unsigned char size,
|
||||||
void *data, unsigned char size);
|
unsigned char *count),
|
||||||
unsigned char *radixtree_chunker(void *data, unsigned char size, unsigned char *count);
|
void *data, unsigned char size);
|
||||||
|
unsigned char *radixtree_chunker(void *data, unsigned char size,
|
||||||
|
unsigned char *count);
|
||||||
|
|
||||||
#endif /* RADIXTREE_H */
|
#endif /* RADIXTREE_H */
|
||||||
|
55
src/tcp.c
55
src/tcp.c
@ -1,6 +1,6 @@
|
|||||||
/*
|
/*
|
||||||
* WrapSix
|
* WrapSix
|
||||||
* Copyright (C) 2008-2012 Michal Zima <xhire@mujmalysvet.cz>
|
* Copyright (C) 2008-2013 Michal Zima <xhire@mujmalysvet.cz>
|
||||||
*
|
*
|
||||||
* This program is free software: you can redistribute it and/or modify
|
* This program is free software: you can redistribute it and/or modify
|
||||||
* it under the terms of the GNU General Public License as published by
|
* it under the terms of the GNU General Public License as published by
|
||||||
@ -106,31 +106,37 @@ int tcp_ipv4(struct s_ethernet *eth4, struct s_ipv4 *ip4, char *payload,
|
|||||||
break;
|
break;
|
||||||
} else if (tcp->flags & TCP_FLAG_RST) {
|
} else if (tcp->flags & TCP_FLAG_RST) {
|
||||||
connection->state = TCP_STATE_TRANS;
|
connection->state = TCP_STATE_TRANS;
|
||||||
linkedlist_move2end(timeout_tcp_trans, connection->llnode);
|
linkedlist_move2end(timeout_tcp_trans,
|
||||||
|
connection->llnode);
|
||||||
break;
|
break;
|
||||||
} else {
|
} else {
|
||||||
linkedlist_move2end(timeout_tcp_est, connection->llnode);
|
linkedlist_move2end(timeout_tcp_est,
|
||||||
|
connection->llnode);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
case TCP_STATE_INIT:
|
case TCP_STATE_INIT:
|
||||||
if (tcp->flags & TCP_FLAG_SYN) {
|
if (tcp->flags & TCP_FLAG_SYN) {
|
||||||
connection->state = TCP_STATE_EST;
|
connection->state = TCP_STATE_EST;
|
||||||
linkedlist_move2end(timeout_tcp_est, connection->llnode);
|
linkedlist_move2end(timeout_tcp_est,
|
||||||
|
connection->llnode);
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case TCP_STATE_FIN4:
|
case TCP_STATE_FIN4:
|
||||||
linkedlist_move2end(timeout_tcp_est, connection->llnode);
|
linkedlist_move2end(timeout_tcp_est,
|
||||||
|
connection->llnode);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case TCP_STATE_FIN6:
|
case TCP_STATE_FIN6:
|
||||||
if (tcp->flags & TCP_FLAG_FIN) {
|
if (tcp->flags & TCP_FLAG_FIN) {
|
||||||
connection->state = TCP_STATE_FIN64;
|
connection->state = TCP_STATE_FIN64;
|
||||||
linkedlist_move2end(timeout_tcp_trans, connection->llnode);
|
linkedlist_move2end(timeout_tcp_trans,
|
||||||
|
connection->llnode);
|
||||||
break;
|
break;
|
||||||
} else {
|
} else {
|
||||||
linkedlist_move2end(timeout_tcp_est, connection->llnode);
|
linkedlist_move2end(timeout_tcp_est,
|
||||||
|
connection->llnode);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -142,7 +148,8 @@ int tcp_ipv4(struct s_ethernet *eth4, struct s_ipv4 *ip4, char *payload,
|
|||||||
break;
|
break;
|
||||||
} else {
|
} else {
|
||||||
connection->state = TCP_STATE_EST;
|
connection->state = TCP_STATE_EST;
|
||||||
linkedlist_move2end(timeout_tcp_est, connection->llnode);
|
linkedlist_move2end(timeout_tcp_est,
|
||||||
|
connection->llnode);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -377,7 +384,8 @@ int tcp_ipv4(struct s_ethernet *eth4, struct s_ipv4 *ip4, char *payload,
|
|||||||
|
|
||||||
/* fill in missing IPv6 fragment header fields */
|
/* fill in missing IPv6 fragment header fields */
|
||||||
frag->offset_flag = htons((htons(ip4->flags_offset) <<
|
frag->offset_flag = htons((htons(ip4->flags_offset) <<
|
||||||
3) | IPV6_FLAG_MORE_FRAGMENTS);
|
3) |
|
||||||
|
IPV6_FLAG_MORE_FRAGMENTS);
|
||||||
|
|
||||||
/* copy the payload data */
|
/* copy the payload data */
|
||||||
memcpy((unsigned char *) frag +
|
memcpy((unsigned char *) frag +
|
||||||
@ -417,7 +425,8 @@ int tcp_ipv4(struct s_ethernet *eth4, struct s_ipv4 *ip4, char *payload,
|
|||||||
sizeof(struct s_ipv6_fragment));
|
sizeof(struct s_ipv6_fragment));
|
||||||
|
|
||||||
/* fill in missing IPv6 fragment header fields */
|
/* fill in missing IPv6 fragment header fields */
|
||||||
frag->offset_flag = htons(htons(ip4->flags_offset) << 3);
|
frag->offset_flag = htons(htons(ip4->flags_offset) <<
|
||||||
|
3);
|
||||||
if (ip4->flags_offset &
|
if (ip4->flags_offset &
|
||||||
htons(IPV4_FLAG_MORE_FRAGMENTS)) {
|
htons(IPV4_FLAG_MORE_FRAGMENTS)) {
|
||||||
frag->offset_flag |=
|
frag->offset_flag |=
|
||||||
@ -497,20 +506,26 @@ int tcp_ipv6(struct s_ethernet *eth6, struct s_ipv6 *ip6, char *payload)
|
|||||||
break;
|
break;
|
||||||
} else if (tcp->flags & TCP_FLAG_RST) {
|
} else if (tcp->flags & TCP_FLAG_RST) {
|
||||||
connection->state = TCP_STATE_TRANS;
|
connection->state = TCP_STATE_TRANS;
|
||||||
linkedlist_move2end(timeout_tcp_trans, connection->llnode);
|
linkedlist_move2end(timeout_tcp_trans,
|
||||||
|
connection->llnode);
|
||||||
break;
|
break;
|
||||||
} else {
|
} else {
|
||||||
linkedlist_move2end(timeout_tcp_est, connection->llnode);
|
linkedlist_move2end(timeout_tcp_est,
|
||||||
|
connection->llnode);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
case TCP_STATE_INIT:
|
case TCP_STATE_INIT:
|
||||||
if (tcp->flags & TCP_FLAG_SYN) {
|
if (tcp->flags & TCP_FLAG_SYN) {
|
||||||
if (connection->llnode == NULL) {
|
if (connection->llnode == NULL) {
|
||||||
connection->llnode = linkedlist_append(timeout_tcp_trans, connection);
|
connection->llnode =
|
||||||
|
linkedlist_append(
|
||||||
|
timeout_tcp_trans,
|
||||||
|
connection);
|
||||||
break;
|
break;
|
||||||
} else {
|
} else {
|
||||||
linkedlist_move2end(timeout_tcp_trans, connection->llnode);
|
linkedlist_move2end(timeout_tcp_trans,
|
||||||
|
connection->llnode);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -519,15 +534,18 @@ int tcp_ipv6(struct s_ethernet *eth6, struct s_ipv6 *ip6, char *payload)
|
|||||||
case TCP_STATE_FIN4:
|
case TCP_STATE_FIN4:
|
||||||
if (tcp->flags & TCP_FLAG_FIN) {
|
if (tcp->flags & TCP_FLAG_FIN) {
|
||||||
connection->state = TCP_STATE_FIN64;
|
connection->state = TCP_STATE_FIN64;
|
||||||
linkedlist_move2end(timeout_tcp_trans, connection->llnode);
|
linkedlist_move2end(timeout_tcp_trans,
|
||||||
|
connection->llnode);
|
||||||
break;
|
break;
|
||||||
} else {
|
} else {
|
||||||
linkedlist_move2end(timeout_tcp_est, connection->llnode);
|
linkedlist_move2end(timeout_tcp_est,
|
||||||
|
connection->llnode);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
case TCP_STATE_FIN6:
|
case TCP_STATE_FIN6:
|
||||||
linkedlist_move2end(timeout_tcp_est, connection->llnode);
|
linkedlist_move2end(timeout_tcp_est,
|
||||||
|
connection->llnode);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case TCP_STATE_FIN64:
|
case TCP_STATE_FIN64:
|
||||||
@ -538,7 +556,8 @@ int tcp_ipv6(struct s_ethernet *eth6, struct s_ipv6 *ip6, char *payload)
|
|||||||
break;
|
break;
|
||||||
} else {
|
} else {
|
||||||
connection->state = TCP_STATE_EST;
|
connection->state = TCP_STATE_EST;
|
||||||
linkedlist_move2end(timeout_tcp_est, connection->llnode);
|
linkedlist_move2end(timeout_tcp_est,
|
||||||
|
connection->llnode);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -1,6 +1,6 @@
|
|||||||
/*
|
/*
|
||||||
* WrapSix
|
* WrapSix
|
||||||
* Copyright (C) 2008-2012 Michal Zima <xhire@mujmalysvet.cz>
|
* Copyright (C) 2008-2013 Michal Zima <xhire@mujmalysvet.cz>
|
||||||
*
|
*
|
||||||
* This program is free software: you can redistribute it and/or modify
|
* This program is free software: you can redistribute it and/or modify
|
||||||
* it under the terms of the GNU General Public License as published by
|
* it under the terms of the GNU General Public License as published by
|
||||||
@ -24,6 +24,7 @@
|
|||||||
int transmission_init(void);
|
int transmission_init(void);
|
||||||
int transmission_quit(void);
|
int transmission_quit(void);
|
||||||
int transmit_raw(unsigned char *data, unsigned int length);
|
int transmit_raw(unsigned char *data, unsigned int length);
|
||||||
int transmit_ipv4(struct s_ipv4_addr *ip, unsigned char *data, unsigned int length);
|
int transmit_ipv4(struct s_ipv4_addr *ip, unsigned char *data,
|
||||||
|
unsigned int length);
|
||||||
|
|
||||||
#endif /* TRANSMITTER_H */
|
#endif /* TRANSMITTER_H */
|
||||||
|
12
src/udp.c
12
src/udp.c
@ -1,6 +1,6 @@
|
|||||||
/*
|
/*
|
||||||
* WrapSix
|
* WrapSix
|
||||||
* Copyright (C) 2008-2012 Michal Zima <xhire@mujmalysvet.cz>
|
* Copyright (C) 2008-2013 Michal Zima <xhire@mujmalysvet.cz>
|
||||||
*
|
*
|
||||||
* This program is free software: you can redistribute it and/or modify
|
* This program is free software: you can redistribute it and/or modify
|
||||||
* it under the terms of the GNU General Public License as published by
|
* it under the terms of the GNU General Public License as published by
|
||||||
@ -25,8 +25,8 @@
|
|||||||
#include "ethernet.h"
|
#include "ethernet.h"
|
||||||
#include "ipv4.h"
|
#include "ipv4.h"
|
||||||
#include "ipv6.h"
|
#include "ipv6.h"
|
||||||
#include "log.h"
|
|
||||||
#include "linkedlist.h"
|
#include "linkedlist.h"
|
||||||
|
#include "log.h"
|
||||||
#include "nat.h"
|
#include "nat.h"
|
||||||
#include "transmitter.h"
|
#include "transmitter.h"
|
||||||
#include "udp.h"
|
#include "udp.h"
|
||||||
@ -75,7 +75,8 @@ int udp_ipv4(struct s_ethernet *eth4, struct s_ipv4 *ip4, char *payload,
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* find connection in NAT */
|
/* find connection in NAT */
|
||||||
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) {
|
||||||
log_debug("Incoming connection wasn't found in NAT");
|
log_debug("Incoming connection wasn't found in NAT");
|
||||||
@ -121,8 +122,9 @@ int udp_ipv4(struct s_ethernet *eth4, struct s_ipv4 *ip4, char *payload,
|
|||||||
connection->ipv6_port_src);
|
connection->ipv6_port_src);
|
||||||
} else {
|
} else {
|
||||||
/* if original checksum was 0x0000, we need to compute it */
|
/* if original checksum was 0x0000, we need to compute it */
|
||||||
udp->checksum = checksum_ipv6(ip6->ip_src, ip6->ip_dest, payload_size,
|
udp->checksum = checksum_ipv6(ip6->ip_src, ip6->ip_dest,
|
||||||
IPPROTO_UDP, (unsigned char *) udp);
|
payload_size, IPPROTO_UDP,
|
||||||
|
(unsigned char *) udp);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* copy the payload data (with new checksum) */
|
/* copy the payload data (with new checksum) */
|
||||||
|
@ -1,6 +1,6 @@
|
|||||||
/*
|
/*
|
||||||
* WrapSix
|
* WrapSix
|
||||||
* Copyright (C) 2008-2012 Michal Zima <xhire@mujmalysvet.cz>
|
* Copyright (C) 2008-2013 Michal Zima <xhire@mujmalysvet.cz>
|
||||||
*
|
*
|
||||||
* This program is free software: you can redistribute it and/or modify
|
* This program is free software: you can redistribute it and/or modify
|
||||||
* it under the terms of the GNU General Public License as published by
|
* it under the terms of the GNU General Public License as published by
|
||||||
@ -18,10 +18,10 @@
|
|||||||
|
|
||||||
#include <arpa/inet.h> /* inet_pton */
|
#include <arpa/inet.h> /* inet_pton */
|
||||||
#include <linux/if_ether.h> /* ETH_P_ALL */
|
#include <linux/if_ether.h> /* ETH_P_ALL */
|
||||||
#include <net/if.h> /* struct ifreq */
|
|
||||||
#include <netpacket/packet.h> /* struct packet_mreq, struct sockaddr_ll */
|
|
||||||
#include <netinet/in.h> /* htons */
|
|
||||||
#include <net/ethernet.h> /* ETHERTYPE_* */
|
#include <net/ethernet.h> /* ETHERTYPE_* */
|
||||||
|
#include <net/if.h> /* struct ifreq */
|
||||||
|
#include <netinet/in.h> /* htons */
|
||||||
|
#include <netpacket/packet.h> /* struct packet_mreq, struct sockaddr_ll */
|
||||||
#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 */
|
||||||
@ -66,7 +66,8 @@ int main(int argc, char **argv)
|
|||||||
log_info(PACKAGE_STRING " is starting");
|
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) {
|
||||||
log_error("Unable to create listening socket");
|
log_error("Unable to create listening socket");
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
@ -80,7 +81,8 @@ int main(int argc, char **argv)
|
|||||||
|
|
||||||
/* get interface's HW address (i.e. MAC) */
|
/* get interface's HW address (i.e. MAC) */
|
||||||
if (ioctl(sniff_sock, SIOCGIFHWADDR, &interface) == 0) {
|
if (ioctl(sniff_sock, SIOCGIFHWADDR, &interface) == 0) {
|
||||||
memcpy(&mac, &interface.ifr_hwaddr.sa_data, sizeof(struct s_mac_addr));
|
memcpy(&mac, &interface.ifr_hwaddr.sa_data,
|
||||||
|
sizeof(struct s_mac_addr));
|
||||||
|
|
||||||
/* reinitialize the interface */
|
/* reinitialize the interface */
|
||||||
if (ioctl(sniff_sock, SIOCGIFINDEX, &interface) == -1) {
|
if (ioctl(sniff_sock, SIOCGIFINDEX, &interface) == -1) {
|
||||||
@ -96,8 +98,10 @@ int main(int argc, char **argv)
|
|||||||
memset(&pmr, 0x0, sizeof(pmr));
|
memset(&pmr, 0x0, sizeof(pmr));
|
||||||
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,
|
||||||
log_error("Unable to set the promiscuous mode on the interface");
|
(char *) &pmr, sizeof(pmr)) == -1) {
|
||||||
|
log_error("Unable to set the promiscuous mode on the "
|
||||||
|
"interface");
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -128,7 +132,8 @@ int main(int argc, char **argv)
|
|||||||
|
|
||||||
/* sniff! :c) */
|
/* sniff! :c) */
|
||||||
for (i = 1;; i++) {
|
for (i = 1;; i++) {
|
||||||
if ((length = recv(sniff_sock, buffer, PACKET_BUFFER, 0)) == -1) {
|
if ((length = recv(sniff_sock, buffer, PACKET_BUFFER, 0)) ==
|
||||||
|
-1) {
|
||||||
log_error("Unable to retrieve data from socket");
|
log_error("Unable to retrieve data from socket");
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
@ -154,9 +159,11 @@ int main(int argc, char **argv)
|
|||||||
nat_quit();
|
nat_quit();
|
||||||
|
|
||||||
/* 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,
|
||||||
log_error("Unable to unset the promiscuous mode on the interface");
|
(char *) &pmr, sizeof(pmr)) == -1) {
|
||||||
/* do not call `return` here as we want to close the socket too */
|
log_error("Unable to unset the promiscuous mode on the "
|
||||||
|
"interface");
|
||||||
|
/* do not call return here as we want to close the socket too */
|
||||||
}
|
}
|
||||||
|
|
||||||
/* close the socket */
|
/* close the socket */
|
||||||
@ -168,7 +175,8 @@ int main(int argc, char **argv)
|
|||||||
int process(char *packet)
|
int process(char *packet)
|
||||||
{
|
{
|
||||||
struct s_ethernet *eth; /* the ethernet header */
|
struct s_ethernet *eth; /* the ethernet header */
|
||||||
char *payload; /* the IP header + packet payload */
|
char *payload; /* the IP header + packet
|
||||||
|
payload */
|
||||||
|
|
||||||
/* parse ethernet header */
|
/* parse ethernet header */
|
||||||
eth = (struct s_ethernet *) (packet);
|
eth = (struct s_ethernet *) (packet);
|
||||||
|
Loading…
Reference in New Issue
Block a user