4 * The secure anycast tunneling protocol (satp) defines a protocol used
5 * for communication between any combination of unicast and anycast
6 * tunnel endpoints. It has less protocol overhead than IPSec in Tunnel
7 * mode and allows tunneling of every ETHER TYPE protocol (e.g.
8 * ethernet, ip, arp ...). satp directly includes cryptography and
9 * message authentication based on the methodes used by SRTP. It is
10 * intended to deliver a generic, scaleable and secure solution for
11 * tunneling and relaying of packets of any protocol.
14 * Copyright (C) 2007-2008 Othmar Gsenger, Erwin Nindl,
15 * Christian Pointner <satp@wirdorange.org>
17 * This file is part of Anytun.
19 * Anytun is free software: you can redistribute it and/or modify
20 * it under the terms of the GNU General Public License version 3 as
21 * published by the Free Software Foundation.
23 * Anytun is distributed in the hope that it will be useful,
24 * but WITHOUT ANY WARRANTY; without even the implied warranty of
25 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
26 * GNU General Public License for more details.
28 * You should have received a copy of the GNU General Public License
29 * along with anytun. If not, see <http://www.gnu.org/licenses/>.
34 #include "datatypes.h"
36 #include "plainPacket.h"
38 PlainPacket::PlainPacket(u_int32_t payload_length
, bool allow_realloc
) : Buffer(payload_length
+ sizeof(payload_type_t
), allow_realloc
)
40 payload_type_
= reinterpret_cast<payload_type_t
*>(buf_
);
41 payload_
= buf_
+ sizeof(payload_type_t
);
45 u_int32_t
PlainPacket::getHeaderLength()
47 return sizeof(payload_type_t
);
50 payload_type_t
PlainPacket::getPayloadType() const
53 return PAYLOAD_TYPE_T_NTOH(*payload_type_
);
58 void PlainPacket::setPayloadType(payload_type_t payload_type
)
63 if(payload_type
== PAYLOAD_TYPE_TUN
) {
65 *payload_type_
= PAYLOAD_TYPE_T_HTON(PAYLOAD_TYPE_TUN
);
69 char * ip_version_ptr
= reinterpret_cast<char *>(payload_
);
70 char ip_version
= ip_version_ptr
[0];
73 *payload_type_
= PAYLOAD_TYPE_T_HTON(PAYLOAD_TYPE_TUN4
);
74 else if(ip_version
== 6)
75 *payload_type_
= PAYLOAD_TYPE_T_HTON(PAYLOAD_TYPE_TUN6
);
78 *payload_type_
= PAYLOAD_TYPE_T_HTON(payload_type
);
81 u_int32_t
PlainPacket::getPayloadLength() const
86 return (length_
> sizeof(payload_type_t
)) ? (length_
- sizeof(payload_type_t
)) : 0;
89 void PlainPacket::setPayloadLength(u_int32_t payload_length
)
91 Buffer::setLength(payload_length
+ sizeof(payload_type_t
));
92 // depending on allow_realloc buf_ may point to another address
93 // therefore in this case reinit() gets called by Buffer::setLength()
96 void PlainPacket::reinit()
98 payload_type_
= reinterpret_cast<payload_type_t
*>(buf_
);
99 payload_
= buf_
+ sizeof(payload_type_t
);
101 if(length_
<= (sizeof(payload_type_t
)))
104 if(length_
< (sizeof(payload_type_t
))) {
105 payload_type_
= NULL
;
106 throw std::runtime_error("packet can't be initialized, buffer is too small");
111 u_int8_t
* PlainPacket::getPayload()
117 NetworkAddress PlainPacket::getSrcAddr() const
119 if(!payload_type_ || !payload_)
120 return NetworkAddress();
122 payload_type_t type = PAYLOAD_TYPE_T_NTOH(*payload_type_);
124 if(type == PAYLOAD_TYPE_TAP) // Ehternet
127 return NetworkAddress();
129 else if(type == PAYLOAD_TYPE_TUN4) // IPv4
131 if(length_ < (sizeof(payload_type_t)+sizeof(struct ip)))
132 return NetworkAddress();
133 struct ip* hdr = reinterpret_cast<struct ip*>(payload_);
134 return NetworkAddress(hdr->ip_src);
136 else if(type == PAYLOAD_TYPE_TUN6) // IPv6
138 if(length_ < (sizeof(payload_type_t)+sizeof(struct ip6_hdr)))
139 return NetworkAddress();
140 struct ip6_hdr* hdr = reinterpret_cast<struct ip6_hdr*>(payload_);
141 return NetworkAddress(hdr->ip6_src);
143 return NetworkAddress();
146 NetworkAddress
PlainPacket::getDstAddr() const
148 if(!payload_type_
|| !payload_
)
149 return NetworkAddress();
151 payload_type_t type
= PAYLOAD_TYPE_T_NTOH(*payload_type_
);
153 if(type
== PAYLOAD_TYPE_TAP
) // Ehternet
156 return NetworkAddress();
158 else if(type
== PAYLOAD_TYPE_TUN4
) // IPv4
160 if(length_
< (sizeof(payload_type_t
)+5*4))
161 return NetworkAddress();
162 char * hdr
= reinterpret_cast<char *>(payload_
);
163 boost::asio::ip::address_v4::bytes_type ip_octets
;
164 for (int i
=0; i
<4;i
++)
165 ip_octets
[i
]=hdr
[4*4+i
];
166 return NetworkAddress(boost::asio::ip::address_v4(ip_octets
));
168 else if(type
== PAYLOAD_TYPE_TUN6
) // IPv6
170 if(length_
< (sizeof(payload_type_t
)+2*16+2*4))
171 return NetworkAddress();
172 char * hdr
= reinterpret_cast<char *>(payload_
);
173 boost::asio::ip::address_v6::bytes_type ip_octets
;
174 for (int i
=0; i
<16;i
++)
175 ip_octets
[i
]=hdr
[2*4+16+i
];
176 return NetworkAddress(boost::asio::ip::address_v6(ip_octets
));
178 return NetworkAddress();