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 anytun.org <satp@wirdorange.org>
16 * This program is free software; you can redistribute it and/or modify
17 * it under the terms of the GNU General Public License version 2
18 * as published by the Free Software Foundation.
20 * This program is distributed in the hope that it will be useful,
21 * but WITHOUT ANY WARRANTY; without even the implied warranty of
22 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
23 * GNU General Public License for more details.
25 * You should have received a copy of the GNU General Public License
26 * along with this program (see the file COPYING included with this
27 * distribution); if not, write to the Free Software Foundation, Inc.,
28 * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
33 #include <arpa/inet.h>
34 #include <net/ethernet.h>
35 #include <netinet/ip.h>
36 #include <netinet/ip6.h>
38 #include "datatypes.h"
39 #include "plainPacket.h"
41 PlainPacket::PlainPacket(u_int32_t payload_length
, bool allow_realloc
) : Buffer(payload_length
+ sizeof(payload_type_t
), allow_realloc
)
43 payload_type_
= reinterpret_cast<payload_type_t
*>(buf_
);
44 payload_
= buf_
+ sizeof(payload_type_t
);
48 payload_type_t
PlainPacket::getPayloadType() const
51 return PAYLOAD_TYPE_T_NTOH(*payload_type_
);
56 void PlainPacket::setPayloadType(payload_type_t payload_type
)
59 *payload_type_
= PAYLOAD_TYPE_T_HTON(payload_type
);
62 u_int32_t
PlainPacket::getPayloadLength() const
64 return (length_
> sizeof(payload_type_t
)) ? (length_
- sizeof(payload_type_t
)) : 0;
67 void PlainPacket::setPayloadLength(u_int32_t payload_length
)
69 Buffer::setLength(payload_length
+ sizeof(payload_type_t
));
70 // depending on allow_realloc buf_ may point to another address
71 // therefore in this case reinit() gets called by Buffer::setLength()
74 void PlainPacket::reinit()
77 payload_type_
= reinterpret_cast<payload_type_t
*>(buf_
);
78 payload_
= buf_
+ sizeof(payload_type_t
);
81 u_int8_t
* PlainPacket::getPayload()
87 NetworkAddress
PlainPacket::getSrcAddr() const
89 if(!payload_type_
|| !payload_
)
90 return NetworkAddress();
92 payload_type_t type
= PAYLOAD_TYPE_T_NTOH(*payload_type_
);
94 if(type
== PAYLOAD_TYPE_TAP
) // Ehternet
97 return NetworkAddress();
99 else if(type
== PAYLOAD_TYPE_TUN
) // IPv4
101 if(length_
< (sizeof(payload_type_t
)+sizeof(struct ip
)))
102 return NetworkAddress();
103 struct ip
* hdr
= reinterpret_cast<struct ip
*>(payload_
);
104 return NetworkAddress(hdr
->ip_src
);
106 else if(type
== PAYLOAD_TYPE_TUN6
) // IPv6
108 if(length_
< (sizeof(payload_type_t
)+sizeof(struct ip6_hdr
)))
109 return NetworkAddress();
110 struct ip6_hdr
* hdr
= reinterpret_cast<struct ip6_hdr
*>(payload_
);
111 return NetworkAddress(hdr
->ip6_dst
);
113 return NetworkAddress();
117 NetworkAddress
PlainPacket::getDstAddr() 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_TUN
) // 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_dst
);
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_dst
);
143 return NetworkAddress();