mirror of
https://github.com/mfontanini/libtins
synced 2026-01-27 04:11:35 +01:00
Code cleanup and use same syntax on the entire project
Initial code cleanup More code cleanup Cleanup more code Cleanup Dot11 code Fix OSX build issue Cleanup examples Fix ref and pointer declaration syntax Fix braces
This commit is contained in:
@@ -31,12 +31,15 @@
|
||||
#include "rawpdu.h"
|
||||
#include "tcp_stream.h"
|
||||
|
||||
using std::numeric_limits;
|
||||
using std::make_pair;
|
||||
|
||||
namespace Tins {
|
||||
|
||||
// As defined by RFC 1982 - 2 ^ (SERIAL_BITS - 1)
|
||||
static const uint32_t seq_number_diff = 2147483648U;
|
||||
// As defined by RFC 1982 - 2 ^ (SERIAL_BITS)
|
||||
static const uint32_t addition_modulo = std::numeric_limits<uint32_t>::max();
|
||||
static const uint32_t addition_modulo = numeric_limits<uint32_t>::max();
|
||||
|
||||
// Sequence number add as defined by RFC 1982
|
||||
uint32_t add_sequence_numbers(uint32_t seq1, uint32_t seq2) {
|
||||
@@ -45,19 +48,22 @@ uint32_t add_sequence_numbers(uint32_t seq1, uint32_t seq2) {
|
||||
|
||||
// Subtract sequence numbers
|
||||
uint32_t subtract_sequence_numbers(uint32_t seq1, uint32_t seq2) {
|
||||
if(seq1 > seq2)
|
||||
if (seq1 > seq2) {
|
||||
return seq1 - seq2;
|
||||
else
|
||||
}
|
||||
else {
|
||||
// the numbers between seq2 and the maximum sequence number(including seq1)
|
||||
// + the numbers between 0 and seq1
|
||||
return (std::numeric_limits<uint32_t>::max() - seq2) + seq1 + 1;
|
||||
return (numeric_limits<uint32_t>::max() - seq2) + seq1 + 1;
|
||||
}
|
||||
}
|
||||
|
||||
// Compares sequence numbers as defined by RFC 1982.
|
||||
int compare_seq_numbers(uint32_t seq1, uint32_t seq2) {
|
||||
if(seq1 == seq2)
|
||||
if (seq1 == seq2) {
|
||||
return 0;
|
||||
if(seq1 < seq2) {
|
||||
}
|
||||
if (seq1 < seq2) {
|
||||
return (seq2 - seq1 < seq_number_diff) ? -1 : 1;
|
||||
}
|
||||
else {
|
||||
@@ -70,84 +76,87 @@ Iterator erase_iterator(Iterator it, Container& cont) {
|
||||
Iterator output = it;
|
||||
++output;
|
||||
cont.erase(it);
|
||||
if(output == cont.end())
|
||||
if (output == cont.end()) {
|
||||
output = cont.begin();
|
||||
}
|
||||
return output;
|
||||
}
|
||||
|
||||
|
||||
// TCPStreamFollower
|
||||
|
||||
TCPStreamFollower::TCPStreamFollower() : last_identifier(0) {
|
||||
TCPStreamFollower::TCPStreamFollower()
|
||||
: last_identifier_(0) {
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
||||
TCPStream::StreamInfo::StreamInfo(IPv4Address client,
|
||||
IPv4Address server, uint16_t cport, uint16_t sport)
|
||||
IPv4Address server,
|
||||
uint16_t cport,
|
||||
uint16_t sport)
|
||||
: client_addr(client), server_addr(server), client_port(cport),
|
||||
server_port(sport)
|
||||
{
|
||||
|
||||
server_port(sport) {
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
TCPStream::TCPStream(IP *ip, TCP *tcp, uint64_t identifier)
|
||||
: client_seq(tcp->seq()), server_seq(0), info(ip->src_addr(),
|
||||
ip->dst_addr(), tcp->sport(), tcp->dport()), identifier(identifier),
|
||||
syn_ack_sent(false), fin_sent(false)
|
||||
{
|
||||
|
||||
TCPStream::TCPStream(IP* ip, TCP* tcp, uint64_t identifier)
|
||||
: client_seq_(tcp->seq()), server_seq_(0), info_(ip->src_addr(),
|
||||
ip->dst_addr(), tcp->sport(), tcp->dport()), identifier_(identifier),
|
||||
syn_ack_sent_(false), fin_sent_(false) {
|
||||
}
|
||||
|
||||
TCPStream::TCPStream(const TCPStream &rhs) {
|
||||
TCPStream::TCPStream(const TCPStream& rhs) {
|
||||
*this = rhs;
|
||||
}
|
||||
|
||||
TCPStream& TCPStream::operator=(const TCPStream &rhs) {
|
||||
client_seq = rhs.client_seq;
|
||||
server_seq = rhs.server_seq;
|
||||
info = rhs.info;
|
||||
identifier = rhs.identifier;
|
||||
syn_ack_sent = rhs.syn_ack_sent;
|
||||
fin_sent = rhs.fin_sent;
|
||||
TCPStream& TCPStream::operator=(const TCPStream& rhs) {
|
||||
client_seq_ = rhs.client_seq_;
|
||||
server_seq_ = rhs.server_seq_;
|
||||
info_ = rhs.info_;
|
||||
identifier_ = rhs.identifier_;
|
||||
syn_ack_sent_ = rhs.syn_ack_sent_;
|
||||
fin_sent_ = rhs.fin_sent_;
|
||||
client_payload_ = rhs.client_payload_;
|
||||
server_payload_ = rhs.server_payload_;
|
||||
client_frags = clone_fragments(rhs.client_frags);
|
||||
server_frags = clone_fragments(rhs.server_frags);
|
||||
return *this;
|
||||
client_frags_ = clone_fragments(rhs.client_frags_);
|
||||
server_frags_ = clone_fragments(rhs.server_frags_);
|
||||
return* this;
|
||||
}
|
||||
|
||||
TCPStream::~TCPStream() {
|
||||
free_fragments(client_frags);
|
||||
free_fragments(server_frags);
|
||||
free_fragments(client_frags_);
|
||||
free_fragments(server_frags_);
|
||||
}
|
||||
|
||||
void TCPStream::free_fragments(fragments_type &frags) {
|
||||
for(fragments_type::iterator it = frags.begin(); it != frags.end(); ++it)
|
||||
void TCPStream::free_fragments(fragments_type& frags) {
|
||||
for (fragments_type::iterator it = frags.begin(); it != frags.end(); ++it) {
|
||||
delete it->second;
|
||||
}
|
||||
}
|
||||
|
||||
TCPStream::fragments_type TCPStream::clone_fragments(const fragments_type &frags) {
|
||||
TCPStream::fragments_type TCPStream::clone_fragments(const fragments_type& frags) {
|
||||
fragments_type new_frags;
|
||||
for(fragments_type::const_iterator it = frags.begin(); it != frags.end(); ++it)
|
||||
new_frags.insert(std::make_pair(it->first, it->second->clone()));
|
||||
for (fragments_type::const_iterator it = frags.begin(); it != frags.end(); ++it) {
|
||||
new_frags.insert(make_pair(it->first, it->second->clone()));
|
||||
}
|
||||
return new_frags;
|
||||
}
|
||||
|
||||
void TCPStream::safe_insert(fragments_type &frags, uint32_t seq, RawPDU *raw)
|
||||
{
|
||||
void TCPStream::safe_insert(fragments_type& frags, uint32_t seq, RawPDU* raw) {
|
||||
RawPDU*& stored_raw = frags[seq];
|
||||
// New segment, insert it
|
||||
if(stored_raw == 0)
|
||||
if (stored_raw == 0) {
|
||||
stored_raw = raw;
|
||||
}
|
||||
else {
|
||||
// There was a segment in this position. Keep the largest one.
|
||||
if(stored_raw->payload_size() > raw->payload_size())
|
||||
if (stored_raw->payload_size() > raw->payload_size()) {
|
||||
delete raw;
|
||||
}
|
||||
else {
|
||||
delete stored_raw;
|
||||
stored_raw = raw;
|
||||
@@ -155,20 +164,23 @@ void TCPStream::safe_insert(fragments_type &frags, uint32_t seq, RawPDU *raw)
|
||||
}
|
||||
}
|
||||
|
||||
bool TCPStream::generic_process(uint32_t &my_seq, uint32_t &other_seq,
|
||||
payload_type &pload, fragments_type &frags, TCP *tcp)
|
||||
{
|
||||
bool TCPStream::generic_process(uint32_t& my_seq,
|
||||
uint32_t& other_seq,
|
||||
payload_type& pload,
|
||||
fragments_type& frags,
|
||||
TCP* tcp) {
|
||||
bool added_some(false);
|
||||
if(tcp->get_flag(TCP::FIN) || tcp->get_flag(TCP::RST))
|
||||
fin_sent = true;
|
||||
RawPDU *raw = static_cast<RawPDU*>(tcp->release_inner_pdu());
|
||||
if(raw) {
|
||||
if (tcp->get_flag(TCP::FIN) || tcp->get_flag(TCP::RST)) {
|
||||
fin_sent_ = true;
|
||||
}
|
||||
RawPDU* raw = static_cast<RawPDU*>(tcp->release_inner_pdu());
|
||||
if (raw) {
|
||||
const uint32_t chunk_end = add_sequence_numbers(tcp->seq(), raw->payload_size());
|
||||
// If the end of the chunk ends after our current sequence number, process it.
|
||||
if(compare_seq_numbers(chunk_end, my_seq) >= 0) {
|
||||
if (compare_seq_numbers(chunk_end, my_seq) >= 0) {
|
||||
uint32_t seq = tcp->seq();
|
||||
// If it starts before our sequence number, slice it
|
||||
if(compare_seq_numbers(seq, my_seq) < 0) {
|
||||
if (compare_seq_numbers(seq, my_seq) < 0) {
|
||||
const uint32_t diff = subtract_sequence_numbers(my_seq, seq);
|
||||
raw->payload().erase(
|
||||
raw->payload().begin(),
|
||||
@@ -179,13 +191,13 @@ bool TCPStream::generic_process(uint32_t &my_seq, uint32_t &other_seq,
|
||||
safe_insert(frags, seq, raw);
|
||||
fragments_type::iterator it = frags.find(my_seq);
|
||||
// Keep looping while the fragments seq is lower or equal to our seq
|
||||
while(it != frags.end() && compare_seq_numbers(it->first, my_seq) <= 0) {
|
||||
while (it != frags.end() && compare_seq_numbers(it->first, my_seq) <= 0) {
|
||||
// Does this fragment start before our sequence number?
|
||||
if(compare_seq_numbers(it->first, my_seq) < 0) {
|
||||
if (compare_seq_numbers(it->first, my_seq) < 0) {
|
||||
uint32_t fragment_end = add_sequence_numbers(it->first, it->second->payload_size());
|
||||
int comparison = compare_seq_numbers(fragment_end, my_seq);
|
||||
// Does it end after our sequence number?
|
||||
if(comparison > 0) {
|
||||
if (comparison > 0) {
|
||||
// Then slice it
|
||||
RawPDU::payload_type& payload = it->second->payload();
|
||||
payload.erase(
|
||||
@@ -212,48 +224,55 @@ bool TCPStream::generic_process(uint32_t &my_seq, uint32_t &other_seq,
|
||||
delete it->second;
|
||||
it = erase_iterator(it, frags);
|
||||
added_some = true;
|
||||
if(frags.empty())
|
||||
if (frags.empty()) {
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
else
|
||||
else {
|
||||
delete raw;
|
||||
}
|
||||
}
|
||||
return added_some;
|
||||
}
|
||||
|
||||
bool TCPStream::update(IP *ip, TCP *tcp) {
|
||||
if(!syn_ack_sent) {
|
||||
if(tcp->flags() == (TCP::SYN | TCP::ACK)) {
|
||||
server_seq = tcp->seq() + 1;
|
||||
client_seq = tcp->ack_seq();
|
||||
syn_ack_sent = true;
|
||||
bool TCPStream::update(IP* ip, TCP* tcp) {
|
||||
if (!syn_ack_sent_) {
|
||||
if (tcp->flags() == (TCP::SYN | TCP::ACK)) {
|
||||
server_seq_ = tcp->seq() + 1;
|
||||
client_seq_ = tcp->ack_seq();
|
||||
syn_ack_sent_ = true;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
else {
|
||||
if(ip->src_addr() == info.client_addr && tcp->sport() == info.client_port)
|
||||
return generic_process(client_seq, server_seq, client_payload_, client_frags, tcp);
|
||||
if (ip->src_addr() == info_.client_addr && tcp->sport() == info_.client_port) {
|
||||
return generic_process(client_seq_, server_seq_, client_payload_, client_frags_, tcp);
|
||||
}
|
||||
else {
|
||||
return generic_process(server_seq, client_seq, server_payload_, server_frags, tcp);
|
||||
return generic_process(server_seq_, client_seq_, server_payload_, server_frags_, tcp);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
bool TCPStream::StreamInfo::operator<(const StreamInfo &rhs) const {
|
||||
if(client_addr == rhs.client_addr) {
|
||||
if(server_addr == rhs.server_addr) {
|
||||
if(client_port == rhs.client_port) {
|
||||
bool TCPStream::StreamInfo::operator<(const StreamInfo& rhs) const {
|
||||
if (client_addr == rhs.client_addr) {
|
||||
if (server_addr == rhs.server_addr) {
|
||||
if (client_port == rhs.client_port) {
|
||||
return server_port < rhs.server_port;
|
||||
}
|
||||
else
|
||||
else {
|
||||
return client_port < rhs.client_port;
|
||||
}
|
||||
}
|
||||
else
|
||||
else {
|
||||
return server_addr < rhs.server_addr;
|
||||
}
|
||||
}
|
||||
else
|
||||
else {
|
||||
return client_addr < rhs.client_addr;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
} // Tins
|
||||
|
||||
Reference in New Issue
Block a user