From 1d02345a24f6e439545c0752e4dfcb54b8a23537 Mon Sep 17 00:00:00 2001 From: Nathan Binkert Date: Tue, 21 Sep 2004 01:41:55 -0400 Subject: a bit more cleaning of the network header wrappers. base/inet.hh: add functions to the various headers to grab the most common encapsulated protocols. This could easily get out of hand, but we're just worrying about tcp, udp, and ip for now. add common functions size(), bytes(), and payload() to all wrappers. size() gets the header size bytes() returns a uint8_t * to the beginning of the header payload() returns a uint8_t * to the beginning of the payload. dev/etherpkt.cc: dev/etherpkt.hh: don't cache pointers to headers. It's probably not worth the hassle. --HG-- extra : convert_revision : ba9df85ac019b8a48233042dde79fb9da9546410 --- dev/etherpkt.cc | 23 ----------------------- dev/etherpkt.hh | 30 +++++++++++------------------- 2 files changed, 11 insertions(+), 42 deletions(-) (limited to 'dev') diff --git a/dev/etherpkt.cc b/dev/etherpkt.cc index 292fe7faf..273b8ee64 100644 --- a/dev/etherpkt.cc +++ b/dev/etherpkt.cc @@ -33,29 +33,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) { 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 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); -- cgit v1.2.3