inet.hh revision 1078
12810Srdreslin@umich.edu/*
210343SCurtis.Dunham@arm.com * Copyright (c) 2002-2003 The Regents of The University of Michigan
38702Sandreas.hansson@arm.com * All rights reserved.
48702Sandreas.hansson@arm.com *
58702Sandreas.hansson@arm.com * Redistribution and use in source and binary forms, with or without
68702Sandreas.hansson@arm.com * modification, are permitted provided that the following conditions are
78702Sandreas.hansson@arm.com * met: redistributions of source code must retain the above copyright
88702Sandreas.hansson@arm.com * notice, this list of conditions and the following disclaimer;
98702Sandreas.hansson@arm.com * redistributions in binary form must reproduce the above copyright
108702Sandreas.hansson@arm.com * notice, this list of conditions and the following disclaimer in the
118702Sandreas.hansson@arm.com * documentation and/or other materials provided with the distribution;
128702Sandreas.hansson@arm.com * neither the name of the copyright holders nor the names of its
138702Sandreas.hansson@arm.com * contributors may be used to endorse or promote products derived from
142810Srdreslin@umich.edu * this software without specific prior written permission.
152810Srdreslin@umich.edu *
162810Srdreslin@umich.edu * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
172810Srdreslin@umich.edu * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
182810Srdreslin@umich.edu * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
192810Srdreslin@umich.edu * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
202810Srdreslin@umich.edu * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
212810Srdreslin@umich.edu * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
222810Srdreslin@umich.edu * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
232810Srdreslin@umich.edu * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
242810Srdreslin@umich.edu * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
252810Srdreslin@umich.edu * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
262810Srdreslin@umich.edu * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
272810Srdreslin@umich.edu */
282810Srdreslin@umich.edu
292810Srdreslin@umich.edu#ifndef __BASE_INET_HH__
302810Srdreslin@umich.edu#define __BASE_INET_HH__
312810Srdreslin@umich.edu
322810Srdreslin@umich.edu#include <string>
332810Srdreslin@umich.edu
342810Srdreslin@umich.edu#include "dnet/os.h"
352810Srdreslin@umich.edu
362810Srdreslin@umich.edu#include "dnet/eth.h"
372810Srdreslin@umich.edu#include "dnet/ip.h"
382810Srdreslin@umich.edu#include "dnet/ip6.h"
392810Srdreslin@umich.edu#include "dnet/addr.h"
402810Srdreslin@umich.edu#include "dnet/arp.h"
412810Srdreslin@umich.edu#include "dnet/icmp.h"
422810Srdreslin@umich.edu#include "dnet/tcp.h"
434458Sstever@eecs.umich.edu#include "dnet/udp.h"
448856Sandreas.hansson@arm.com
452810Srdreslin@umich.edu#include "dnet/intf.h"
462810Srdreslin@umich.edu#include "dnet/route.h"
472810Srdreslin@umich.edu#include "dnet/fw.h"
482810Srdreslin@umich.edu
492810Srdreslin@umich.edu#include "dnet/blob.h"
502810Srdreslin@umich.edu#include "dnet/rand.h"
512810Srdreslin@umich.edu
5211051Sandreas.hansson@arm.com#include "sim/host.hh"
5311051Sandreas.hansson@arm.com
542810Srdreslin@umich.edustd::string eaddr_string(const uint8_t a[6]);
552810Srdreslin@umich.edu
565338Sstever@gmail.comstruct EthHdr : protected eth_hdr
575338Sstever@gmail.com{
585338Sstever@gmail.com    uint16_t type() const { return ntohs(eth_type); }
5910815Sdavid.guillen@arm.com    const uint8_t *payload() const { return (const uint8_t *)this + sizeof(*this); }
6011053Sandreas.hansson@arm.com    uint8_t *payload() { return (uint8_t *)this + sizeof(*this); }
614458Sstever@eecs.umich.edu
624458Sstever@eecs.umich.edu    bool unicast() { return eth_dst.data[0] == 0x00; }
632813Srdreslin@umich.edu    bool multicast() { return eth_dst.data[0] == 0x01; }
643861Sstever@eecs.umich.edu    bool broadcast() { return eth_dst.data[0] == 0xff; }
652810Srdreslin@umich.edu};
662810Srdreslin@umich.edu
672810Srdreslin@umich.edustruct IpHdr : protected ip_hdr
682810Srdreslin@umich.edu{
699264Sdjordje.kovacevic@arm.com    uint8_t  version() const { return ip_v; }
702810Srdreslin@umich.edu    uint8_t  hlen() const { return ip_hl; }
712810Srdreslin@umich.edu    uint8_t  tos() const { return ip_tos; }
722810Srdreslin@umich.edu    uint16_t len() const { return ntohs(ip_len); }
732810Srdreslin@umich.edu    uint16_t id() const { return ntohs(ip_id); }
7410815Sdavid.guillen@arm.com    uint16_t frag_flags() const { return ntohs(ip_off) >> 13; }
7510815Sdavid.guillen@arm.com    uint16_t frag_off() const { return ntohs(ip_off) & 0x1fff; }
7610815Sdavid.guillen@arm.com    uint8_t  ttl() const { return ip_ttl; }
772810Srdreslin@umich.edu    uint8_t  proto() const { return ip_p; }
782810Srdreslin@umich.edu    uint16_t sum() const { return ntohs(ip_sum); }
792810Srdreslin@umich.edu    uint32_t src() const { return ntohl(ip_src); }
808856Sandreas.hansson@arm.com    uint32_t dst() const { return ntohl(ip_dst); }
818856Sandreas.hansson@arm.com
828856Sandreas.hansson@arm.com    void sum(uint16_t sum) { ip_sum = htons(sum); }
838856Sandreas.hansson@arm.com
848856Sandreas.hansson@arm.com    uint16_t ip_cksum() const;
853738Sstever@eecs.umich.edu    uint16_t tu_cksum() const;
868856Sandreas.hansson@arm.com    const uint8_t  *payload() const { return (const uint8_t *)this + hlen(); }
873738Sstever@eecs.umich.edu    uint8_t  *payload() { return (uint8_t *)this + hlen(); }
888856Sandreas.hansson@arm.com};
8910815Sdavid.guillen@arm.com
903738Sstever@eecs.umich.edustruct TcpHdr : protected tcp_hdr
918856Sandreas.hansson@arm.com{
924478Sstever@eecs.umich.edu    uint16_t sport() const { return ntohs(th_sport); }
938975Sandreas.hansson@arm.com    uint16_t dport() const { return ntohs(th_dport); }
948948Sandreas.hansson@arm.com    uint32_t seq() const { return ntohl(th_seq); }
958975Sandreas.hansson@arm.com    uint32_t ack() const { return ntohl(th_ack); }
963738Sstever@eecs.umich.edu    uint8_t  off() const { return th_off; }
973738Sstever@eecs.umich.edu    uint8_t  flags() const { return th_flags & 0x3f; }
983738Sstever@eecs.umich.edu    uint16_t win() const { return ntohs(th_win); }
993738Sstever@eecs.umich.edu    uint16_t sum() const { return ntohs(th_sum); }
1008856Sandreas.hansson@arm.com    uint16_t urp() const { return ntohs(th_urp); }
1019090Sandreas.hansson@arm.com
1028856Sandreas.hansson@arm.com    void sum(uint16_t sum) { th_sum = htons(sum); }
1038856Sandreas.hansson@arm.com
1048856Sandreas.hansson@arm.com    const uint8_t *payload() const { return (const uint8_t *)this + off(); }
10510815Sdavid.guillen@arm.com    uint8_t *payload() { return (uint8_t *)this + off(); }
1068856Sandreas.hansson@arm.com};
1078856Sandreas.hansson@arm.com
1083738Sstever@eecs.umich.edustruct UdpHdr : protected udp_hdr
1093738Sstever@eecs.umich.edu{
1108856Sandreas.hansson@arm.com    uint16_t sport() const { return ntohs(uh_sport); }
1118914Sandreas.hansson@arm.com    uint16_t dport() const { return ntohs(uh_dport); }
1128914Sandreas.hansson@arm.com    uint16_t len() const { return ntohs(uh_ulen); }
1138914Sandreas.hansson@arm.com    uint16_t sum() const { return ntohs(uh_sum); }
1148914Sandreas.hansson@arm.com
1158914Sandreas.hansson@arm.com    void sum(uint16_t sum) { uh_sum = htons(sum); }
11610713Sandreas.hansson@arm.com
1178914Sandreas.hansson@arm.com    const uint8_t *payload() const { return (const uint8_t *)this + sizeof(*this); }
1188914Sandreas.hansson@arm.com    uint8_t *payload() { return (uint8_t *)this + sizeof(*this); }
1198914Sandreas.hansson@arm.com};
1208914Sandreas.hansson@arm.com
12110815Sdavid.guillen@arm.com#endif // __BASE_INET_HH__
12210713Sandreas.hansson@arm.com