etherpkt.hh revision 837
1/* 2 * Copyright (c) 2003 The Regents of The University of Michigan 3 * All rights reserved. 4 * 5 * Redistribution and use in source and binary forms, with or without 6 * modification, are permitted provided that the following conditions are 7 * met: redistributions of source code must retain the above copyright 8 * notice, this list of conditions and the following disclaimer; 9 * redistributions in binary form must reproduce the above copyright 10 * notice, this list of conditions and the following disclaimer in the 11 * documentation and/or other materials provided with the distribution; 12 * neither the name of the copyright holders nor the names of its 13 * contributors may be used to endorse or promote products derived from 14 * this software without specific prior written permission. 15 * 16 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 17 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 18 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 19 * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 20 * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 21 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 22 * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 23 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 24 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 25 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 26 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 27 */ 28 29/* @file 30 * Reference counted class containing ethernet packet data 31 */ 32 33#ifndef __ETHERPKT_HH__ 34#define __ETHERPKT_HH__ 35 36#include <memory> 37 38#include "sim/host.hh" 39#include "base/refcnt.hh" 40 41#define EADDR_LEN 6 42 43class Checkpoint; 44 45struct pseudo_header 46{ 47 uint32_t src_ip_addr; 48 uint32_t dest_ip_addr; 49 uint16_t protocol; 50 uint16_t len; 51}; 52 53/** Ethernet header struct for casting purposes */ 54struct eth_header 55{ 56 uint8_t dest[EADDR_LEN]; 57 uint8_t src[EADDR_LEN]; 58 uint16_t type; 59}; 60 61struct ip_header 62{ 63 uint8_t vers_len; 64 uint8_t service_type; 65 uint16_t dgram_len; 66 uint16_t ID; 67 uint16_t flags_frag_offset; 68 uint8_t TTL; 69 uint8_t protocol; 70 uint16_t hdr_chksum; 71 uint32_t src_ip_addr; 72 uint32_t dest_ip_addr; 73 uint8_t *options; 74 uint8_t *transport_header; 75}; 76 77struct tcp_header 78{ 79 uint16_t src_port_num; 80 uint16_t dest_port_num; 81 uint32_t seq_num; 82 uint32_t ack_num; 83 uint8_t hdr_len; 84 uint8_t flags; 85 uint16_t rcv_window; 86 uint16_t chksum; 87 uint16_t urgent; 88 uint8_t *options; 89 uint8_t *data; 90}; 91 92struct udp_header 93{ 94 uint16_t src_port_num; 95 uint16_t dest_port_num; 96 uint16_t len; 97 uint16_t chksum; 98 uint8_t *data; 99}; 100 101/* 102 * Reference counted class containing ethernet packet data 103 */ 104class EtherPacket : public RefCounted 105{ 106 public: 107 uint8_t *data; 108 int length; 109 110 public: 111 EtherPacket() : data(NULL), length(0) {} 112 EtherPacket(std::auto_ptr<uint8_t> d, int l) 113 : data(d.release()), length(l) {} 114 ~EtherPacket() { if (data) delete [] data; } 115 116 public: 117 bool IsUnicast() { return data[0] == 0x00; } 118 bool IsMulticast() { return data[0] == 0x01; } 119 bool IsBroadcast() { return data[0] == 0xff; } 120 121 ip_header *getIpHdr() { return (ip_header *) (data + 14); } 122 123 void *getTransportHdr() { 124 ip_header *ip = getIpHdr(); 125 return (void *) (ip + (ip->vers_len & 0xf)); 126 } 127 128 129 typedef RefCountingPtr<EtherPacket> PacketPtr; 130 131 void serialize(std::ostream &os); 132 void unserialize(Checkpoint *cp, const std::string §ion); 133}; 134 135typedef RefCountingPtr<EtherPacket> PacketPtr; 136 137#endif // __ETHERPKT_HH__ 138