summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorChristian Pointner <equinox@anytun.org>2007-06-18 20:27:25 +0000
committerChristian Pointner <equinox@anytun.org>2007-06-18 20:27:25 +0000
commit5387db5e548f4c539f74476717ecba0ff05476cd (patch)
treeecfeb43b0d3e7ad57b5cd18640f31bcd5a51afe4
parentadded header functions to package (diff)
package with all member functions (not working yet)
-rw-r--r--anytun.cpp140
-rw-r--r--package.cpp108
-rw-r--r--package.h1
3 files changed, 228 insertions, 21 deletions
diff --git a/anytun.cpp b/anytun.cpp
index 4b11231..8213df3 100644
--- a/anytun.cpp
+++ b/anytun.cpp
@@ -49,36 +49,136 @@ int main(int argc, char* argv[])
Package pack(test);
std::cout << std::hex;
- std::cout << "pack[0-" << pack.getLength() << "]: '";
- for(unsigned int i=0; i<pack.getLength(); ++i)
- std::cout << (int)pack[i] << ",";
- std::cout << std::endl;
- std::cout << "pack: hdr=" << pack.hasHeader() << " seq_nr=" << pack.getSeqNr() << " sender_id=" << pack.getSenderId() << std::endl;
- pack.setSeqNr(0x55AA55AA).setSenderId(0xBB11);
+// std::cout << "pack[0-" << pack.getLength() << "]: '";
+// for(unsigned int i=0; i<pack.getLength(); ++i)
+// std::cout << (int)pack[i] << ",";
+// std::cout << std::endl;
+// std::cout << "pack: hdr=" << pack.hasHeader() << " seq_nr=" << pack.getSeqNr() << " sender_id=" << pack.getSenderId() << std::endl;
- std::cout << "pack[0-" << pack.getLength() << "]: '";
- for(unsigned int i=0; i<pack.getLength(); ++i)
- std::cout << (int)pack[i] << ",";
- std::cout << std::endl;
- std::cout << "pack: hdr=" << pack.hasHeader() << " seq_nr=" << pack.getSeqNr() << " sender_id=" << pack.getSenderId() << std::endl;
+// pack.setSeqNr(0x55AA55AA).setSenderId(0xBB11);
+
+// std::cout << "pack[0-" << pack.getLength() << "]: '";
+// for(unsigned int i=0; i<pack.getLength(); ++i)
+// std::cout << (int)pack[i] << ",";
+// std::cout << std::endl;
+// std::cout << "pack: hdr=" << pack.hasHeader() << " seq_nr=" << pack.getSeqNr() << " sender_id=" << pack.getSenderId() << std::endl;
- pack.addHeader(0x12345678, 0x9ABC);
+// pack.addHeader(0x12345678, 0x9ABC);
- std::cout << "pack[0-" << pack.getLength() << "]: '";
- for(unsigned int i=0; i<pack.getLength(); ++i)
- std::cout << (int)pack[i] << ",";
- std::cout << std::endl;
- std::cout << "pack: hdr=" << pack.hasHeader() << " seq_nr=" << pack.getSeqNr() << " sender_id=" << pack.getSenderId() << std::endl;
+// std::cout << "pack[0-" << pack.getLength() << "]: '";
+// for(unsigned int i=0; i<pack.getLength(); ++i)
+// std::cout << (int)pack[i] << ",";
+// std::cout << std::endl;
+// std::cout << "pack: hdr=" << pack.hasHeader() << " seq_nr=" << pack.getSeqNr() << " sender_id=" << pack.getSenderId() << std::endl;
+
+// pack.removeHeader();
+
+// std::cout << "pack[0-" << pack.getLength() << "]: '";
+// for(unsigned int i=0; i<pack.getLength(); ++i)
+// std::cout << (int)pack[i] << ",";
+// std::cout << std::endl;
+// std::cout << "pack: hdr=" << pack.hasHeader() << " seq_nr=" << pack.getSeqNr() << " sender_id=" << pack.getSenderId() << std::endl;
- pack.removeHeader();
+// pack.withHeader(true);
+
+// std::cout << "pack[0-" << pack.getLength() << "]: '";
+// for(unsigned int i=0; i<pack.getLength(); ++i)
+// std::cout << (int)pack[i] << ",";
+// std::cout << std::endl;
+// std::cout << "pack: hdr=" << pack.hasHeader() << " seq_nr=" << pack.getSeqNr() << " sender_id=" << pack.getSenderId() << std::endl;
+
+// pack.withHeader(false);
+
+// std::cout << "pack[0-" << pack.getLength() << "]: '";
+// for(unsigned int i=0; i<pack.getLength(); ++i)
+// std::cout << (int)pack[i] << ",";
+// std::cout << std::endl;
+// std::cout << "pack: hdr=" << pack.hasPayloadType() << " payload_type=" << pack.getPayloadType() << std::endl;
+
+// pack.addPayloadType(0xCCFF);
+
+// std::cout << "pack[0-" << pack.getLength() << "]: '";
+// for(unsigned int i=0; i<pack.getLength(); ++i)
+// std::cout << (int)pack[i] << ",";
+// std::cout << std::endl;
+// std::cout << "pack: payt=" << pack.hasPayloadType() << " payload_type=" << pack.getPayloadType() << std::endl;
+
+// pack.addPayloadType(0xEEBB);
+
+// std::cout << "pack[0-" << pack.getLength() << "]: '";
+// for(unsigned int i=0; i<pack.getLength(); ++i)
+// std::cout << (int)pack[i] << ",";
+// std::cout << std::endl;
+// std::cout << "pack: payt=" << pack.hasPayloadType() << " payload_type=" << pack.getPayloadType() << std::endl;
+
+// pack.removePayloadType();
+
+// std::cout << "pack[0-" << pack.getLength() << "]: '";
+// for(unsigned int i=0; i<pack.getLength(); ++i)
+// std::cout << (int)pack[i] << ",";
+// std::cout << std::endl;
+// std::cout << "pack: payt=" << pack.hasPayloadType() << " payload_type=" << pack.getPayloadType() << std::endl;
+
+// pack.withPayloadType(true);
+
+// std::cout << "pack[0-" << pack.getLength() << "]: '";
+// for(unsigned int i=0; i<pack.getLength(); ++i)
+// std::cout << (int)pack[i] << ",";
+// std::cout << std::endl;
+// std::cout << "pack: payt=" << pack.hasPayloadType() << " payload_type=" << pack.getPayloadType() << std::endl;
+
+// pack.withPayloadType(false);
+
+// std::cout << "pack[0-" << pack.getLength() << "]: '";
+// for(unsigned int i=0; i<pack.getLength(); ++i)
+// std::cout << (int)pack[i] << ",";
+// std::cout << std::endl;
+// std::cout << "pack: payt=" << pack.hasPayloadType() << " payload_type=" << pack.getPayloadType() << std::endl;
+
+// pack.addAuthTag(0xCCDDEEFF);
+
+// std::cout << "pack[0-" << pack.getLength() << "]: '";
+// for(unsigned int i=0; i<pack.getLength(); ++i)
+// std::cout << (int)pack[i] << ",";
+// std::cout << std::endl;
+// std::cout << "pack: autht=" << pack.hasAuthTag() << " auth_tag=" << pack.getAuthTag() << std::endl;
+
+// pack.removeAuthTag();
+
+// std::cout << "pack[0-" << pack.getLength() << "]: '";
+// for(unsigned int i=0; i<pack.getLength(); ++i)
+// std::cout << (int)pack[i] << ",";
+// std::cout << std::endl;
+// std::cout << "pack: autht=" << pack.hasAuthTag() << " auth_tag=" << pack.getAuthTag() << std::endl;
+
+// pack.withAuthTag(true);
+
+// std::cout << "pack[0-" << pack.getLength() << "]: '";
+// for(unsigned int i=0; i<pack.getLength(); ++i)
+// std::cout << (int)pack[i] << ",";
+// std::cout << std::endl;
+// std::cout << "pack: autht=" << pack.hasAuthTag() << " auth_tag=" << pack.getAuthTag() << std::endl;
+
+// pack.withAuthTag(false);
+
+// std::cout << "pack[0-" << pack.getLength() << "]: '";
+// for(unsigned int i=0; i<pack.getLength(); ++i)
+// std::cout << (int)pack[i] << ",";
+// std::cout << std::endl;
+// std::cout << "pack: autht=" << pack.hasAuthTag() << " auth_tag=" << pack.getAuthTag() << std::endl;
+
+ std::cout << std::endl << std::endl;
+
+ pack.addHeader(0x56789ABC,0xDEF0);
std::cout << "pack[0-" << pack.getLength() << "]: '";
for(unsigned int i=0; i<pack.getLength(); ++i)
std::cout << (int)pack[i] << ",";
std::cout << std::endl;
- std::cout << "pack: hdr=" << pack.hasHeader() << " seq_nr=" << pack.getSeqNr() << " sender_id=" << pack.getSenderId() << std::endl;
-
+ std::cout << "pack: hdr=" << pack.hasHeader() << " payt=" << pack.hasPayloadType() << " autht=" << pack.hasAuthTag() << std::endl;
+ std::cout << "seq_nr=" << pack.getSeqNr() << " sender_id=" << pack.getSenderId() << " payload_type=" << pack.getPayloadType()
+ << " auth_tag=" << pack.getAuthTag() << std::endl;
std::cout << std::dec;
diff --git a/package.cpp b/package.cpp
index e41c7a0..fe042d1 100644
--- a/package.cpp
+++ b/package.cpp
@@ -28,6 +28,7 @@
* 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*/
+#include <stdexcept>
#include <arpa/inet.h>
#include "datatypes.h"
@@ -128,3 +129,110 @@ Package& Package::setSenderId(sender_id_t sender_id)
return *this;
}
+
+bool Package::hasPayloadType() const
+{
+ return payload_type_;
+}
+
+Package& Package::withPayloadType(bool b)
+{
+ if(auth_tag_)
+ throw std::runtime_error("can't change payload_type state with existing auth_tag");
+
+ if(b && length_ >= sizeof(payload_type_t))
+ payload_type_ = reinterpret_cast<payload_type_t*>(&buf_[length_ - sizeof(payload_type_t)]);
+ else
+ payload_type_ = 0;
+
+ return *this;
+}
+
+payload_type_t Package::getPayloadType() const
+{
+ if(!payload_type_)
+ return 0;
+
+ return PAYLOAD_TYPE_T_NTOH(*payload_type_);
+}
+
+Package& Package::addPayloadType(payload_type_t payload_type)
+{
+ if(auth_tag_)
+ throw std::runtime_error("can't add payload_type with existing auth_tag");
+
+ if(!payload_type_)
+ {
+ if(sizeof(payload_type_t) > resizeBack(length_ + sizeof(payload_type_t)))
+ return *this;
+
+ payload_type_ = reinterpret_cast<payload_type_t*>(&buf_[length_ - sizeof(payload_type_t)]);
+ }
+ *payload_type_ = PAYLOAD_TYPE_T_HTON(payload_type);
+ return *this;
+}
+
+Package& Package::removePayloadType()
+{
+ if(auth_tag_)
+ throw std::runtime_error("can't remove payload_type with existing auth_tag");
+
+ if(!payload_type_)
+ return *this;
+
+ if(length_ >= sizeof(payload_type_t))
+ resizeBack(length_ - sizeof(payload_type_t));
+
+ payload_type_ = 0;
+
+ return *this;
+}
+
+bool Package::hasAuthTag() const
+{
+ return auth_tag_;
+}
+
+Package& Package::withAuthTag(bool b)
+{
+ if(b && length_ >= sizeof(auth_tag_t))
+ auth_tag_ = reinterpret_cast<auth_tag_t*>(&buf_[length_ - sizeof(auth_tag_t)]);
+ else
+ auth_tag_ = 0;
+
+ return *this;
+}
+
+auth_tag_t Package::getAuthTag() const
+{
+ if(!auth_tag_)
+ return 0;
+
+ return AUTH_TAG_T_NTOH(*auth_tag_);
+}
+
+Package& Package::addAuthTag(auth_tag_t auth_tag)
+{
+ if(!auth_tag_)
+ {
+ if(sizeof(auth_tag_t) > resizeBack(length_ + sizeof(auth_tag_t)))
+ return *this;
+
+ auth_tag_ = reinterpret_cast<auth_tag_t*>(&buf_[length_ - sizeof(auth_tag_t)]);
+ }
+ *auth_tag_ = AUTH_TAG_T_HTON(auth_tag);
+ return *this;
+}
+
+Package& Package::removeAuthTag()
+{
+ if(!auth_tag_)
+ return *this;
+
+ if(length_ >= sizeof(auth_tag_t))
+ resizeBack(length_ - sizeof(auth_tag_t));
+
+ auth_tag_ = 0;
+
+ return *this;
+}
diff --git a/package.h b/package.h
index 2a28f2c..a5f7a84 100644
--- a/package.h
+++ b/package.h
@@ -50,7 +50,6 @@ public:
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;