From 2a49fd31380e3b4fb041ee919eb429f074008924 Mon Sep 17 00:00:00 2001 From: Christian Pointner Date: Mon, 18 Jun 2007 18:50:41 +0000 Subject: added header functions to package --- anytun.cpp | 49 ++++++++++++++++++++++--------- datatypes.h | 11 +++++++ package.cpp | 96 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ package.h | 30 +++++++++++++------ 4 files changed, 164 insertions(+), 22 deletions(-) diff --git a/anytun.cpp b/anytun.cpp index 72040c4..4b11231 100644 --- a/anytun.cpp +++ b/anytun.cpp @@ -35,6 +35,7 @@ #include "tunDevice.h" #include "buffer.h" +#include "package.h" #include "cypher.h" #include "authAlgo.h" @@ -42,28 +43,50 @@ int main(int argc, char* argv[]) { std::cout << "anytun - secure anycast tunneling protocol" << std::endl; -// Buffer test(25); -// for(unsigned int i=0; igetActualName() << "'" << std::endl; // std::cout << "dev type is '" << dev->getType() << "'" << std::endl; - // sleep(10); diff --git a/datatypes.h b/datatypes.h index af08549..4083e7a 100644 --- a/datatypes.h +++ b/datatypes.h @@ -44,8 +44,19 @@ typedef signed long long int64_t; typedef unsigned long long u_int64_t; typedef u_int32_t seq_nr_t; +#define SEQ_NR_T_NTOH(a) ntohl(a) +#define SEQ_NR_T_HTON(a) htonl(a) + typedef u_int16_t sender_id_t; +#define SENDER_ID_T_NTOH(a) ntohs(a) +#define SENDER_ID_T_HTON(a) htons(a) + typedef u_int16_t payload_type_t; +#define PAYLOAD_TYPE_T_NTOH(a) ntohs(a) +#define PAYLOAD_TYPE_T_HTON(a) htons(a) + typedef u_int32_t auth_tag_t; +#define AUTH_TAG_T_NTOH(a) ntohl(a) +#define AUTH_TAG_T_HTON(a) htonl(a) #endif diff --git a/package.cpp b/package.cpp index b008a67..e41c7a0 100644 --- a/package.cpp +++ b/package.cpp @@ -28,7 +28,103 @@ * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ +#include + #include "datatypes.h" #include "package.h" +Package::Package() +{ + header_ = 0; + payload_type_ = 0; + auth_tag_ = 0; +} + +Package::Package(u_int32_t length) : Buffer(length) +{ + header_ = 0; + payload_type_ = 0; + auth_tag_ = 0; +} + +Package::Package(const Buffer &src) : Buffer(src) +{ + header_ = 0; + payload_type_ = 0; + auth_tag_ = 0; +} + +bool Package::hasHeader() const +{ + return header_; +} + +Package& Package::withHeader(bool b) +{ + if(b && length_ >= sizeof(struct HeaderStruct)) + header_ = reinterpret_cast(buf_); + else + header_ = 0; + + return *this; +} + +seq_nr_t Package::getSeqNr() const +{ + if(!header_) + return 0; + + return SEQ_NR_T_NTOH(header_->seq_nr); +} + +sender_id_t Package::getSenderId() const +{ + if(!header_) + return 0; + + return SENDER_ID_T_NTOH(header_->sender_id); +} + +Package& Package::addHeader(seq_nr_t seq_nr, sender_id_t sender_id) +{ + if(!header_) + { + if(sizeof(struct HeaderStruct) > resizeFront(length_ + sizeof(struct HeaderStruct))) + return *this; + + header_ = reinterpret_cast(buf_); + } + header_->seq_nr = SEQ_NR_T_HTON(seq_nr); + header_->sender_id = SENDER_ID_T_HTON(sender_id); + return *this; +} + +Package& Package::removeHeader() +{ + if(!header_) + return *this; + + if(length_ >= sizeof(struct HeaderStruct)) + resizeFront(length_ - sizeof(struct HeaderStruct)); + + header_ = 0; + + return *this; +} + +Package& Package::setSeqNr(seq_nr_t seq_nr) +{ + if(header_) + header_->seq_nr = SEQ_NR_T_HTON(seq_nr); + + return *this; +} + +Package& Package::setSenderId(sender_id_t sender_id) +{ + if(header_) + header_->sender_id = SENDER_ID_T_HTON(sender_id); + + return *this; +} diff --git a/package.h b/package.h index 53f71f5..2a28f2c 100644 --- a/package.h +++ b/package.h @@ -37,29 +37,41 @@ class Package : public Buffer { public: - Package() {} - Package(const Buffer &src) {} + Package(); + Package(u_int32_t length); + Package(const Buffer &src); bool hasHeader() const; Package& withHeader(bool b); seq_nr_t getSeqNr() const; sender_id_t getSenderId() const; - Package& setHeader(seq_nr_t seq_nr, sender_id_t sender_id); + Package& addHeader(seq_nr_t seq_nr, sender_id_t sender_id); + Package& removeHeader(); + Package& setSeqNr(seq_nr_t seq_nr); + Package& setSenderId(sender_id_t sender_id); + bool hasPayloadType() const; Package& withPayloadType(bool b); payload_type_t getPayloadType() const; - Package& setPayloadType(payload_type_t payload_type); - + Package& addPayloadType(payload_type_t payload_type); + Package& removePayloadType(); + bool hasAuthTag() const; Package& withAuthTag(bool b); auth_tag_t getAuthTag() const; - Package& setAuthTag(auth_tag_t auth_tag); + Package& addAuthTag(auth_tag_t auth_tag); + Package& removeAuthTag(); private: - bool has_header_; - bool has_payload_type_; - bool has_auth_tag_; + struct HeaderStruct + { + seq_nr_t seq_nr; + sender_id_t sender_id; + }__attribute__((__packed__)); + struct HeaderStruct* header_; + payload_type_t* payload_type_; + auth_tag_t* auth_tag_; }; #endif -- cgit v1.2.3