X-Git-Url: https://git.syn-net.org/debian/?p=anytun.git;a=blobdiff_plain;f=src%2FplainPacket.cpp;h=ad37263057e3765bd2575600e7ac51e23206f6ee;hp=79a72de7acb049c5d4c9f30bad75183c9de2b531;hb=ef0cacf2508418915d3f64b04003be3c13fed3cc;hpb=ece844834d2cecc028ce81ca283f5d441088580e diff --git a/src/plainPacket.cpp b/src/plainPacket.cpp index 79a72de..ad37263 100644 --- a/src/plainPacket.cpp +++ b/src/plainPacket.cpp @@ -11,7 +11,7 @@ * tunneling and relaying of packets of any protocol. * * - * Copyright (C) 2007-2009 Othmar Gsenger, Erwin Nindl, + * Copyright (C) 2007-2009 Othmar Gsenger, Erwin Nindl, * Christian Pointner * * This file is part of Anytun. @@ -37,62 +37,66 @@ #include "plainPacket.h" #include "anytunError.h" -PlainPacket::PlainPacket(u_int32_t payload_length, bool allow_realloc) : Buffer(payload_length + sizeof(payload_type_t), allow_realloc) +PlainPacket::PlainPacket(uint32_t payload_length, bool allow_realloc) : Buffer(payload_length + sizeof(payload_type_t), allow_realloc) { payload_type_ = reinterpret_cast(buf_); payload_ = buf_ + sizeof(payload_type_t); *payload_type_ = 0; } -u_int32_t PlainPacket::getHeaderLength() +uint32_t PlainPacket::getHeaderLength() { return sizeof(payload_type_t); } payload_type_t PlainPacket::getPayloadType() const { - if(payload_type_) + if(payload_type_) { return PAYLOAD_TYPE_T_NTOH(*payload_type_); + } return 0; } void PlainPacket::setPayloadType(payload_type_t payload_type) { - if(!payload_type_) + if(!payload_type_) { return; - + } + if(payload_type == PAYLOAD_TYPE_TUN) { if(!payload_) { *payload_type_ = PAYLOAD_TYPE_T_HTON(PAYLOAD_TYPE_TUN); return; } - char * ip_version_ptr = reinterpret_cast(payload_); - char ip_version = ip_version_ptr[0]; - ip_version >>=4; - if(ip_version == 4) + char* ip_version_ptr = reinterpret_cast(payload_); + char ip_version = ip_version_ptr[0]; + ip_version >>=4; + if(ip_version == 4) { *payload_type_ = PAYLOAD_TYPE_T_HTON(PAYLOAD_TYPE_TUN4); - else if(ip_version == 6) + } else if(ip_version == 6) { *payload_type_ = PAYLOAD_TYPE_T_HTON(PAYLOAD_TYPE_TUN6); - } - else + } + } else { *payload_type_ = PAYLOAD_TYPE_T_HTON(payload_type); + } } -u_int32_t PlainPacket::getPayloadLength() const +uint32_t PlainPacket::getPayloadLength() const { - if(!payload_) + if(!payload_) { return 0; + } return (length_ > sizeof(payload_type_t)) ? (length_ - sizeof(payload_type_t)) : 0; } - -void PlainPacket::setPayloadLength(u_int32_t payload_length) + +void PlainPacket::setPayloadLength(uint32_t payload_length) { Buffer::setLength(payload_length + sizeof(payload_type_t)); - // depending on allow_realloc buf_ may point to another address - // therefore in this case reinit() gets called by Buffer::setLength() + // depending on allow_realloc buf_ may point to another address + // therefore in this case reinit() gets called by Buffer::setLength() } void PlainPacket::reinit() @@ -100,17 +104,18 @@ void PlainPacket::reinit() payload_type_ = reinterpret_cast(buf_); payload_ = buf_ + sizeof(payload_type_t); - if(length_ <= (sizeof(payload_type_t))) + if(length_ <= (sizeof(payload_type_t))) { payload_ = NULL; + } if(length_ < (sizeof(payload_type_t))) { payload_type_ = NULL; - AnytunError::throwErr() << "plain packet can't be initialized, buffer is too small"; + AnytunError::throwErr() << "plain packet can't be initialized, buffer is too small"; } } -u_int8_t* PlainPacket::getPayload() +uint8_t* PlainPacket::getPayload() { return payload_; } @@ -147,35 +152,35 @@ NetworkAddress PlainPacket::getSrcAddr() const NetworkAddress PlainPacket::getDstAddr() const { - if(!payload_type_ || !payload_) - return NetworkAddress(); - - payload_type_t type = PAYLOAD_TYPE_T_NTOH(*payload_type_); - - if(type == PAYLOAD_TYPE_TAP) // Ehternet - { - // TODO - return NetworkAddress(); - } - else if(type == PAYLOAD_TYPE_TUN4) // IPv4 - { - if(length_ < (sizeof(payload_type_t)+5*4)) - return NetworkAddress(); - char * hdr = reinterpret_cast(payload_); - boost::asio::ip::address_v4::bytes_type ip_octets; - for (int i=0; i<4;i++) - ip_octets[i]=hdr[4*4+i]; - return NetworkAddress(boost::asio::ip::address_v4(ip_octets)); - } - else if(type == PAYLOAD_TYPE_TUN6) // IPv6 - { - if(length_ < (sizeof(payload_type_t)+2*16+2*4)) - return NetworkAddress(); - char * hdr = reinterpret_cast(payload_); - boost::asio::ip::address_v6::bytes_type ip_octets; - for (int i=0; i<16;i++) - ip_octets[i]=hdr[2*4+16+i]; - return NetworkAddress(boost::asio::ip::address_v6(ip_octets)); - } - return NetworkAddress(); + if(!payload_type_ || !payload_) { + return NetworkAddress(); + } + + payload_type_t type = PAYLOAD_TYPE_T_NTOH(*payload_type_); + + if(type == PAYLOAD_TYPE_TAP) { // Ehternet + // TODO + return NetworkAddress(); + } else if(type == PAYLOAD_TYPE_TUN4) { // IPv4 + if(length_ < (sizeof(payload_type_t)+5*4)) { + return NetworkAddress(); + } + char* hdr = reinterpret_cast(payload_); + boost::asio::ip::address_v4::bytes_type ip_octets; + for(int i=0; i<4; i++) { + ip_octets[i]=hdr[4*4+i]; + } + return NetworkAddress(boost::asio::ip::address_v4(ip_octets)); + } else if(type == PAYLOAD_TYPE_TUN6) { // IPv6 + if(length_ < (sizeof(payload_type_t)+2*16+2*4)) { + return NetworkAddress(); + } + char* hdr = reinterpret_cast(payload_); + boost::asio::ip::address_v6::bytes_type ip_octets; + for(int i=0; i<16; i++) { + ip_octets[i]=hdr[2*4+16+i]; + } + return NetworkAddress(boost::asio::ip::address_v6(ip_octets)); + } + return NetworkAddress(); }