X-Git-Url: https://git.syn-net.org/debian/?a=blobdiff_plain;f=src%2FplainPacket.cpp;h=86540d4921b745774d708dcff3e95899d02f3518;hb=refs%2Fheads%2Fupstream;hp=9c39b6380b81b80b4b375fdbac616ce3f55fd583;hpb=058ae090a970436caec3b3059e9e18b310dd6b0d;p=anytun.git diff --git a/src/plainPacket.cpp b/src/plainPacket.cpp index 9c39b63..86540d4 100644 --- a/src/plainPacket.cpp +++ b/src/plainPacket.cpp @@ -6,19 +6,20 @@ * tunnel endpoints. It has less protocol overhead than IPSec in Tunnel * mode and allows tunneling of every ETHER TYPE protocol (e.g. * ethernet, ip, arp ...). satp directly includes cryptography and - * message authentication based on the methodes used by SRTP. It is + * message authentication based on the methods used by SRTP. It is * intended to deliver a generic, scaleable and secure solution for * tunneling and relaying of packets of any protocol. * * - * Copyright (C) 2007-2008 Othmar Gsenger, Erwin Nindl, + * Copyright (C) 2007-2014 Markus Grüneis, Othmar Gsenger, Erwin Nindl, * Christian Pointner * * This file is part of Anytun. * * Anytun is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 3 as - * published by the Free Software Foundation. + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * any later version. * * Anytun is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of @@ -26,7 +27,20 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with anytun. If not, see . + * along with Anytun. If not, see . + * + * In addition, as a special exception, the copyright holders give + * permission to link the code of portions of this program with the + * OpenSSL library under certain conditions as described in each + * individual source file, and distribute linked combinations + * including the two. + * You must obey the GNU General Public License in all respects + * for all of the code used other than OpenSSL. If you modify + * file(s) with this exception, you may extend this exception to your + * version of the file(s), but you are not obligated to do so. If you + * do not wish to do so, delete this exception statement from your + * version. If you delete this exception statement from all source + * files in the program, then also delete it here. */ #include @@ -36,62 +50,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() @@ -99,17 +117,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_; } @@ -146,35 +165,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(); }