diff options
Diffstat (limited to 'dev')
-rw-r--r-- | dev/etherpkt.cc | 23 | ||||
-rw-r--r-- | dev/etherpkt.hh | 30 |
2 files changed, 11 insertions, 42 deletions
diff --git a/dev/etherpkt.cc b/dev/etherpkt.cc index 292fe7faf..273b8ee64 100644 --- a/dev/etherpkt.cc +++ b/dev/etherpkt.cc @@ -34,29 +34,6 @@ using namespace std; void -PacketData::doext() -{ - _eth = 0; - _ip = 0; - _tcp = 0; - _udp = 0; - - if (!data) - return; - - _eth = data; - if (eth()->type() == ETH_TYPE_IP) { - _ip = eth()->payload(); - - if (ip()->proto() == IP_PROTO_TCP) - _tcp = ip()->payload(); - - if (ip()->proto() == IP_PROTO_UDP) - _udp = ip()->payload(); - } -} - -void PacketData::serialize(ostream &os) { SERIALIZE_SCALAR(length); diff --git a/dev/etherpkt.hh b/dev/etherpkt.hh index 53612b830..9c5f00491 100644 --- a/dev/etherpkt.hh +++ b/dev/etherpkt.hh @@ -51,30 +51,22 @@ class PacketData : public RefCounted uint8_t *data; int length; - protected: - uint8_t *_eth; - uint8_t *_ip; - uint8_t *_tcp; - uint8_t *_udp; - - void doext(); - void ext() - { - if (_eth != data) - doext(); - } - public: - PacketData() : data(NULL), length(0) { doext(); } + PacketData() : data(NULL), length(0) { } PacketData(std::auto_ptr<uint8_t> d, int l) - : data(d.release()), length(l) { doext(); } + : data(d.release()), length(l) { } ~PacketData() { if (data) delete [] data; } public: - EthHdr *eth() { ext(); return (EthHdr *)_eth; } - IpHdr *ip() { ext(); return (IpHdr *)_ip; } - TcpHdr *tcp() { ext(); return (TcpHdr *)_tcp; } - UdpHdr *udp() { ext(); return (UdpHdr *)_udp; } + const EthHdr *eth() const { return (const EthHdr *)data; } + const IpHdr *ip() const {const EthHdr *h = eth(); return h ? h->ip() : 0;} + const TcpHdr *tcp() const {const IpHdr *h = ip(); return h ? h->tcp() : 0;} + const UdpHdr *udp() const {const IpHdr *h = ip(); return h ? h->udp() : 0;} + + EthHdr *eth() { return (EthHdr *)data; } + IpHdr *ip() { EthHdr *h = eth(); return h ? h->ip() : 0; } + TcpHdr *tcp() { IpHdr *h = ip(); return h ? h->tcp() : 0; } + UdpHdr *udp() { IpHdr *h = ip(); return h ? h->udp() : 0; } public: void serialize(std::ostream &os); |