summaryrefslogtreecommitdiff
path: root/src/plainPacket.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/plainPacket.cpp')
-rw-r--r--src/plainPacket.cpp59
1 files changed, 33 insertions, 26 deletions
diff --git a/src/plainPacket.cpp b/src/plainPacket.cpp
index b3441e0..46016a5 100644
--- a/src/plainPacket.cpp
+++ b/src/plainPacket.cpp
@@ -115,6 +115,7 @@ u_int8_t* PlainPacket::getPayload()
return payload_;
}
+/*
NetworkAddress PlainPacket::getSrcAddr() const
{
if(!payload_type_ || !payload_)
@@ -142,33 +143,39 @@ NetworkAddress PlainPacket::getSrcAddr() const
return NetworkAddress(hdr->ip6_src);
}
return NetworkAddress();
-}
+}*/
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)+sizeof(struct ip)))
- return NetworkAddress();
- struct ip* hdr = reinterpret_cast<struct ip*>(payload_);
- return NetworkAddress(hdr->ip_dst);
- }
- else if(type == PAYLOAD_TYPE_TUN6) // IPv6
- {
- if(length_ < (sizeof(payload_type_t)+sizeof(struct ip6_hdr)))
- return NetworkAddress();
- struct ip6_hdr* hdr = reinterpret_cast<struct ip6_hdr*>(payload_);
- return NetworkAddress(hdr->ip6_dst);
- }
- 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<char *>(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<char *>(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();
}