summaryrefslogtreecommitdiff
path: root/dev/etherpkt.hh
diff options
context:
space:
mode:
authorLisa Hsu <hsul@eecs.umich.edu>2004-03-12 11:07:32 -0500
committerLisa Hsu <hsul@eecs.umich.edu>2004-03-12 11:07:32 -0500
commit25a07e746759b04223c71ea32530a2cc90be4bc3 (patch)
tree380fd4c547fad2f481463c4fbd8e0e92793ab362 /dev/etherpkt.hh
parent256a1ac478f8da64c6d7d64f04decf2976def2cd (diff)
parent48e6ed48e0672b7b5f5fa65d8fec450483a31676 (diff)
downloadgem5-25a07e746759b04223c71ea32530a2cc90be4bc3.tar.xz
merge etherpkt and makefile
--HG-- extra : convert_revision : 8f416468c7c239a4de6f8df2d632832921c1ced8
Diffstat (limited to 'dev/etherpkt.hh')
-rw-r--r--dev/etherpkt.hh68
1 files changed, 68 insertions, 0 deletions
diff --git a/dev/etherpkt.hh b/dev/etherpkt.hh
index 27ac526d6..09516c427 100644
--- a/dev/etherpkt.hh
+++ b/dev/etherpkt.hh
@@ -39,8 +39,66 @@
#include "sim/host.hh"
#include "base/refcnt.hh"
+#define EADDR_LEN 6
+
class Checkpoint;
+struct pseudo_header
+{
+ uint32_t src_ip_addr;
+ uint32_t dest_ip_addr;
+ uint16_t protocol;
+ uint16_t len;
+};
+
+/** Ethernet header struct for casting purposes */
+struct eth_header
+{
+ uint8_t dest[EADDR_LEN];
+ uint8_t src[EADDR_LEN];
+ uint16_t type;
+};
+
+struct ip_header
+{
+ uint8_t vers_len;
+ uint8_t service_type;
+ uint16_t dgram_len;
+ uint16_t ID;
+ uint16_t flags_frag_offset;
+ uint8_t TTL;
+ uint8_t protocol;
+ uint16_t hdr_chksum;
+ uint32_t src_ip_addr;
+ uint32_t dest_ip_addr;
+ uint8_t *options;
+ uint8_t *transport_header;
+};
+
+struct tcp_header
+{
+ uint16_t src_port_num;
+ uint16_t dest_port_num;
+ uint32_t seq_num;
+ uint32_t ack_num;
+ uint8_t hdr_len;
+ uint8_t flags;
+ uint16_t rcv_window;
+ uint16_t chksum;
+ uint16_t urgent;
+ uint8_t *options;
+ uint8_t *data;
+};
+
+struct udp_header
+{
+ uint16_t src_port_num;
+ uint16_t dest_port_num;
+ uint16_t len;
+ uint16_t chksum;
+ uint8_t *data;
+};
+
/*
* Reference counted class containing ethernet packet data
*/
@@ -61,6 +119,16 @@ class EtherPacket : public RefCounted
bool IsMulticast() { return data[0] == 0x01; }
bool IsBroadcast() { return data[0] == 0xff; }
+ ip_header *getIpHdr() { return (ip_header *) (data + 14); }
+
+ void *getTransportHdr() {
+ ip_header *ip = getIpHdr();
+ return (void *) (ip + (ip->vers_len & 0xf));
+ }
+
+
+ typedef RefCountingPtr<EtherPacket> PacketPtr;
+
void serialize(std::ostream &os);
void unserialize(Checkpoint *cp, const std::string &section);
};