inet.hh revision 1137
12SN/A/*
28922Swilliam.wang@arm.com * Copyright (c) 2002-2003 The Regents of The University of Michigan
38707Sandreas.hansson@arm.com * All rights reserved.
48707Sandreas.hansson@arm.com *
58707Sandreas.hansson@arm.com * Redistribution and use in source and binary forms, with or without
68707Sandreas.hansson@arm.com * modification, are permitted provided that the following conditions are
78707Sandreas.hansson@arm.com * met: redistributions of source code must retain the above copyright
88707Sandreas.hansson@arm.com * notice, this list of conditions and the following disclaimer;
98707Sandreas.hansson@arm.com * redistributions in binary form must reproduce the above copyright
108707Sandreas.hansson@arm.com * notice, this list of conditions and the following disclaimer in the
118707Sandreas.hansson@arm.com * documentation and/or other materials provided with the distribution;
128707Sandreas.hansson@arm.com * neither the name of the copyright holders nor the names of its
138707Sandreas.hansson@arm.com * contributors may be used to endorse or promote products derived from
141762SN/A * this software without specific prior written permission.
157897Shestness@cs.utexas.edu *
169983Sstever@gmail.com * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
179983Sstever@gmail.com * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
182SN/A * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
192SN/A * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
202SN/A * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
212SN/A * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
222SN/A * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
232SN/A * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
242SN/A * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
252SN/A * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
262SN/A * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
272SN/A */
282SN/A
292SN/A#ifndef __BASE_INET_HH__
302SN/A#define __BASE_INET_HH__
312SN/A
322SN/A#include <iosfwd>
332SN/A#include <string>
342SN/A#include <utility>
352SN/A#include <vector>
362SN/A
372SN/A#include "base/range.hh"
382SN/A#include "dev/etherpkt.hh"
392SN/A#include "sim/host.hh"
402SN/A
412SN/A#include "dnet/os.h"
422665Ssaidi@eecs.umich.edu#include "dnet/eth.h"
432665Ssaidi@eecs.umich.edu#include "dnet/ip.h"
442665Ssaidi@eecs.umich.edu#include "dnet/ip6.h"
457897Shestness@cs.utexas.edu#include "dnet/addr.h"
462SN/A#include "dnet/arp.h"
472SN/A#include "dnet/icmp.h"
481388SN/A#include "dnet/tcp.h"
498229Snate@binkert.org#include "dnet/udp.h"
502SN/A#include "dnet/intf.h"
512SN/A#include "dnet/route.h"
527781SAli.Saidi@ARM.com#include "dnet/fw.h"
538229Snate@binkert.org#include "dnet/blob.h"
541191SN/A#include "dnet/rand.h"
551191SN/A
561388SN/Anamespace Net {
575529Snate@binkert.org
581717SN/A/*
598887Sgeoffrey.blake@arm.com * Ethernet Stuff
602651Ssaidi@eecs.umich.edu */
618229Snate@binkert.orgstruct EthAddr : protected eth_addr
622680Sktlim@umich.edu{
638232Snate@binkert.org  protected:
645529Snate@binkert.org    void parse(const std::string &addr);
658779Sgblack@eecs.umich.edu
662190SN/A  public:
6756SN/A    EthAddr();
688229Snate@binkert.org    EthAddr(const uint8_t ea[ETH_ADDR_LEN]);
692190SN/A    EthAddr(const eth_addr &ea);
702SN/A    EthAddr(const std::string &addr);
712359SN/A    const EthAddr &operator=(const eth_addr &ea);
722359SN/A    const EthAddr &operator=(const std::string &addr);
732359SN/A
742SN/A    int size() const { return sizeof(eth_addr); }
752SN/A
762SN/A    const uint8_t *bytes() const { return &data[0]; }
772SN/A    uint8_t *bytes() { return &data[0]; }
782SN/A
792SN/A    const uint8_t *addr() const { return &data[0]; }
802SN/A    bool unicast() const { return data[0] == 0x00; }
812SN/A    bool multicast() const { return data[0] == 0x01; }
822SN/A    bool broadcast() const { return data[0] == 0xff; }
835606Snate@binkert.org    std::string string() const;
846144Sksewell@umich.edu
856144Sksewell@umich.edu    operator uint64_t() const
863126Sktlim@umich.edu    {
876144Sksewell@umich.edu        uint64_t reg = 0;
887823Ssteve.reinhardt@amd.com        reg |= ((uint64_t)data[0]) << 40;
893126Sktlim@umich.edu        reg |= ((uint64_t)data[1]) << 32;
903126Sktlim@umich.edu        reg |= ((uint64_t)data[2]) << 24;
912356SN/A        reg |= ((uint64_t)data[3]) << 16;
922356SN/A        reg |= ((uint64_t)data[4]) << 8;
932356SN/A        reg |= ((uint64_t)data[5]) << 0;
948834Satgutier@umich.edu        return reg;
952356SN/A    }
969179Sandreas.hansson@arm.com
972367SN/A};
986144Sksewell@umich.edu
996144Sksewell@umich.edustd::ostream &operator<<(std::ostream &stream, const EthAddr &ea);
1006144Sksewell@umich.edubool operator==(const EthAddr &left, const EthAddr &right);
1012356SN/A
1022367SN/Astruct EthHdr : public eth_hdr
1036144Sksewell@umich.edu{
1047823Ssteve.reinhardt@amd.com    uint16_t type() const { return ntohs(eth_type); }
1056144Sksewell@umich.edu    const EthAddr &src() const { return *(EthAddr *)&eth_src; }
1062367SN/A    const EthAddr &dst() const { return *(EthAddr *)&eth_dst; }
1072356SN/A
1086144Sksewell@umich.edu    int size() const { return sizeof(eth_hdr); }
1096144Sksewell@umich.edu
1107823Ssteve.reinhardt@amd.com    const uint8_t *bytes() const { return (const uint8_t *)this; }
1112356SN/A    const uint8_t *payload() const { return bytes() + size(); }
1122356SN/A    uint8_t *bytes() { return (uint8_t *)this; }
1132356SN/A    uint8_t *payload() { return bytes() + size(); }
1145336Shines@cs.fsu.edu};
1152356SN/A
1164873Sstever@eecs.umich.educlass EthPtr
1172356SN/A{
1182356SN/A  protected:
1198876Sandreas.hansson@arm.com    friend class IpPtr;
12010190Sakash.bagdia@arm.com    PacketPtr p;
1218832SAli.Saidi@ARM.com
1228832SAli.Saidi@ARM.com  public:
1239332Sdam.sunwoo@arm.com    EthPtr() {}
1249814Sandreas.hansson@arm.com    EthPtr(const PacketPtr &ptr) : p(ptr) { }
1259220Shestness@cs.wisc.edu
1269157Sandreas.hansson@arm.com    EthHdr *operator->() { return (EthHdr *)p->data; }
1272SN/A    EthHdr &operator*() { return *(EthHdr *)p->data; }
1285712Shsul@eecs.umich.edu    operator EthHdr *() { return (EthHdr *)p->data; }
1295712Shsul@eecs.umich.edu
1305712Shsul@eecs.umich.edu    const EthHdr *operator->() const { return (const EthHdr *)p->data; }
1315712Shsul@eecs.umich.edu    const EthHdr &operator*() const { return *(const EthHdr *)p->data; }
1325712Shsul@eecs.umich.edu    operator const EthHdr *() const { return (const EthHdr *)p->data; }
1332SN/A
1342SN/A    const EthPtr &operator=(const PacketPtr &ptr) { p = ptr; return *this; }
1352SN/A
13610190Sakash.bagdia@arm.com    const PacketPtr packet() const { return p; }
13710190Sakash.bagdia@arm.com    PacketPtr packet() { return p; }
1385712Shsul@eecs.umich.edu    bool operator!() const { return !p; }
1396221Snate@binkert.org    operator bool() const { return p; }
1406221Snate@binkert.org};
1412SN/A
1422SN/A/*
1436221Snate@binkert.org * IP Stuff
1446221Snate@binkert.org */
1456221Snate@binkert.orgstruct IpOpt;
1466221Snate@binkert.orgstruct IpHdr : public ip_hdr
1472SN/A{
1482SN/A    uint8_t  version() const { return ip_v; }
1492SN/A    uint8_t  hlen() const { return ip_hl * 4; }
1502SN/A    uint8_t  tos() const { return ip_tos; }
1515606Snate@binkert.org    uint16_t len() const { return ntohs(ip_len); }
1525606Snate@binkert.org    uint16_t id() const { return ntohs(ip_id); }
1539749Sandreas@sandberg.pp.se    uint16_t frag_flags() const { return ntohs(ip_off) >> 13; }
1549749Sandreas@sandberg.pp.se    uint16_t frag_off() const { return ntohs(ip_off) & 0x1fff; }
1555606Snate@binkert.org    uint8_t  ttl() const { return ip_ttl; }
1562SN/A    uint8_t  proto() const { return ip_p; }
1579647Sdam.sunwoo@arm.com    uint16_t sum() const { return ip_sum; }
1589647Sdam.sunwoo@arm.com    uint32_t src() const { return ntohl(ip_src); }
1599647Sdam.sunwoo@arm.com    uint32_t dst() const { return ntohl(ip_dst); }
1609647Sdam.sunwoo@arm.com
1619647Sdam.sunwoo@arm.com    void sum(uint16_t sum) { ip_sum = sum; }
1629647Sdam.sunwoo@arm.com
1639749Sandreas@sandberg.pp.se    bool options(std::vector<const IpOpt *> &vec) const;
1649749Sandreas@sandberg.pp.se
1659647Sdam.sunwoo@arm.com    int size() const { return hlen(); }
1669647Sdam.sunwoo@arm.com    const uint8_t *bytes() const { return (const uint8_t *)this; }
1671400SN/A    const uint8_t *payload() const { return bytes() + size(); }
1685606Snate@binkert.org    uint8_t *bytes() { return (uint8_t *)this; }
1695606Snate@binkert.org    uint8_t *payload() { return bytes() + size(); }
1702SN/A};
1712SN/A
1722SN/Aclass IpPtr
1732SN/A{
1746221Snate@binkert.org  protected:
1756221Snate@binkert.org    friend class TcpPtr;
1765606Snate@binkert.org    friend class UdpPtr;
1776670Shsul@eecs.umich.edu    PacketPtr p;
1785606Snate@binkert.org
1792SN/A    const IpHdr *h() const
1802SN/A    { return (const IpHdr *)(p->data + sizeof(eth_hdr)); }
181124SN/A    IpHdr *h() { return (IpHdr *)(p->data + sizeof(eth_hdr)); }
1826221Snate@binkert.org
1836221Snate@binkert.org    void set(const PacketPtr &ptr)
1846221Snate@binkert.org    {
185124SN/A        EthHdr *eth = (EthHdr *)ptr->data;
186124SN/A        if (eth->type() == ETH_TYPE_IP)
187124SN/A            p = ptr;
188124SN/A        else
1895606Snate@binkert.org            p = 0;
1905606Snate@binkert.org    }
1919749Sandreas@sandberg.pp.se
1929749Sandreas@sandberg.pp.se  public:
1935606Snate@binkert.org    IpPtr() {}
194124SN/A    IpPtr(const PacketPtr &ptr) { set(ptr); }
1951400SN/A    IpPtr(const EthPtr &ptr) { set(ptr.p); }
1965606Snate@binkert.org    IpPtr(const IpPtr &ptr) : p(ptr.p) { }
197124SN/A
198124SN/A    IpHdr *operator->() { return h(); }
199124SN/A    IpHdr &operator*() { return *h(); }
200124SN/A    operator IpHdr *() { return h(); }
2016221Snate@binkert.org
2026221Snate@binkert.org    const IpHdr *operator->() const { return h(); }
2035606Snate@binkert.org    const IpHdr &operator*() const { return *h(); }
2046221Snate@binkert.org    operator const IpHdr *() const { return h(); }
2055606Snate@binkert.org
206124SN/A    const IpPtr &operator=(const PacketPtr &ptr) { set(ptr); return *this; }
207124SN/A    const IpPtr &operator=(const EthPtr &ptr) { set(ptr.p); return *this; }
2081191SN/A    const IpPtr &operator=(const IpPtr &ptr) { p = ptr.p; return *this; }
2095529Snate@binkert.org
2108634Schris.emmons@arm.com    const PacketPtr packet() const { return p; }
2118634Schris.emmons@arm.com    PacketPtr packet() { return p; }
2128634Schris.emmons@arm.com    bool operator!() const { return !p; }
2138634Schris.emmons@arm.com    operator bool() const { return p; }
2148634Schris.emmons@arm.com    operator bool() { return p; }
2151191SN/A};
2165529Snate@binkert.org
2171191SN/Auint16_t cksum(const IpPtr &ptr);
2185529Snate@binkert.org
2191191SN/Astruct IpOpt : public ip_opt
2201191SN/A{
2215606Snate@binkert.org    uint8_t type() const { return opt_type; }
2225606Snate@binkert.org    uint8_t typeNumber() const { return IP_OPT_NUMBER(opt_type); }
2235606Snate@binkert.org    uint8_t typeClass() const { return IP_OPT_CLASS(opt_type); }
2241191SN/A    uint8_t typeCopied() const { return IP_OPT_COPIED(opt_type); }
2251191SN/A    uint8_t len() const { return IP_OPT_TYPEONLY(type()) ? 1 : opt_len; }
2268876Sandreas.hansson@arm.com
2278876Sandreas.hansson@arm.com    bool isNumber(int num) const { return typeNumber() == IP_OPT_NUMBER(num); }
2288876Sandreas.hansson@arm.com    bool isClass(int cls) const { return typeClass() == IP_OPT_CLASS(cls); }
2299433SAndreas.Sandberg@ARM.com    bool isCopied(int cpy) const { return typeCopied() == IP_OPT_COPIED(cpy); }
2308876Sandreas.hansson@arm.com
2318876Sandreas.hansson@arm.com    const uint8_t *data() const { return opt_data.data8; }
2328876Sandreas.hansson@arm.com    void sec(ip_opt_data_sec &sec) const;
2338876Sandreas.hansson@arm.com    void lsrr(ip_opt_data_rr &rr) const;
2348876Sandreas.hansson@arm.com    void ssrr(ip_opt_data_rr &rr) const;
2358876Sandreas.hansson@arm.com    void ts(ip_opt_data_ts &ts) const;
2368876Sandreas.hansson@arm.com    uint16_t satid() const { return ntohs(opt_data.satid); }
2375810Sgblack@eecs.umich.edu    uint16_t mtup() const { return ntohs(opt_data.mtu); }
2388779Sgblack@eecs.umich.edu    uint16_t mtur() const { return ntohs(opt_data.mtu); }
2398779Sgblack@eecs.umich.edu    void tr(ip_opt_data_tr &tr) const;
2408779Sgblack@eecs.umich.edu    const uint32_t *addext() const { return &opt_data.addext[0]; }
2418779Sgblack@eecs.umich.edu    uint16_t rtralt() const { return ntohs(opt_data.rtralt); }
2425529Snate@binkert.org    void sdb(std::vector<uint32_t> &vec) const;
2439384SAndreas.Sandberg@arm.com};
2449384SAndreas.Sandberg@arm.com
2459384SAndreas.Sandberg@arm.com/*
2469384SAndreas.Sandberg@arm.com * TCP Stuff
2479384SAndreas.Sandberg@arm.com */
2481917SN/Astruct TcpOpt;
2491191SN/Astruct TcpHdr : public tcp_hdr
2501191SN/A{
2511191SN/A    uint16_t sport() const { return ntohs(th_sport); }
2521191SN/A    uint16_t dport() const { return ntohs(th_dport); }
2531191SN/A    uint32_t seq() const { return ntohl(th_seq); }
2541191SN/A    uint32_t ack() const { return ntohl(th_ack); }
2551191SN/A    uint8_t  off() const { return th_off; }
2561191SN/A    uint8_t  flags() const { return th_flags & 0x3f; }
2571191SN/A    uint16_t win() const { return ntohs(th_win); }
2589086Sandreas.hansson@arm.com    uint16_t sum() const { return th_sum; }
2599086Sandreas.hansson@arm.com    uint16_t urp() const { return ntohs(th_urp); }
2609086Sandreas.hansson@arm.com
2611191SN/A    void sum(uint16_t sum) { th_sum = sum; }
2621191SN/A
2631129SN/A    bool options(std::vector<const TcpOpt *> &vec) const;
2641129SN/A
2651129SN/A    int size() const { return off(); }
2669523SAndreas.Sandberg@ARM.com    const uint8_t *bytes() const { return (const uint8_t *)this; }
2672680Sktlim@umich.edu    const uint8_t *payload() const { return bytes() + size(); }
2689523SAndreas.Sandberg@ARM.com    uint8_t *bytes() { return (uint8_t *)this; }
2699523SAndreas.Sandberg@ARM.com    uint8_t *payload() { return bytes() + size(); }
2709523SAndreas.Sandberg@ARM.com};
2711129SN/A
272180SN/Aclass TcpPtr
2732SN/A{
2741917SN/A  protected:
2751917SN/A    PacketPtr p;
2768779Sgblack@eecs.umich.edu    int off;
2779433SAndreas.Sandberg@ARM.com
2788779Sgblack@eecs.umich.edu    const TcpHdr *h() const { return (const TcpHdr *)(p->data + off); }
2798779Sgblack@eecs.umich.edu    TcpHdr *h() { return (TcpHdr *)(p->data + off); }
2802356SN/A
2815529Snate@binkert.org    void set(const PacketPtr &ptr, int offset) { p = ptr; off = offset; }
2829179Sandreas.hansson@arm.com    void set(const IpPtr &ptr)
2832356SN/A    {
2841917SN/A        if (ptr->proto() == IP_PROTO_TCP)
2851917SN/A            set(ptr.p, sizeof(eth_hdr) + ptr->hlen());
28610464SAndreas.Sandberg@ARM.com        else
28710464SAndreas.Sandberg@ARM.com            set(0, 0);
28810464SAndreas.Sandberg@ARM.com    }
28910464SAndreas.Sandberg@ARM.com
29010464SAndreas.Sandberg@ARM.com  public:
29110464SAndreas.Sandberg@ARM.com    TcpPtr() {}
29210464SAndreas.Sandberg@ARM.com    TcpPtr(const IpPtr &ptr) { set(ptr); }
29310464SAndreas.Sandberg@ARM.com    TcpPtr(const TcpPtr &ptr) : p(ptr.p), off(ptr.off) {}
29410464SAndreas.Sandberg@ARM.com
29510464SAndreas.Sandberg@ARM.com    TcpHdr *operator->() { return h(); }
29610464SAndreas.Sandberg@ARM.com    TcpHdr &operator*() { return *h(); }
29710464SAndreas.Sandberg@ARM.com    operator TcpHdr *() { return h(); }
29810464SAndreas.Sandberg@ARM.com
29910464SAndreas.Sandberg@ARM.com    const TcpHdr *operator->() const { return h(); }
30010464SAndreas.Sandberg@ARM.com    const TcpHdr &operator*() const { return *h(); }
30110464SAndreas.Sandberg@ARM.com    operator const TcpHdr *() const { return h(); }
30210464SAndreas.Sandberg@ARM.com
30310464SAndreas.Sandberg@ARM.com    const TcpPtr &operator=(const IpPtr &i) { set(i); return *this; }
30410464SAndreas.Sandberg@ARM.com    const TcpPtr &operator=(const TcpPtr &t) { set(t.p, t.off); return *this; }
30510464SAndreas.Sandberg@ARM.com
30610464SAndreas.Sandberg@ARM.com    const PacketPtr packet() const { return p; }
30710464SAndreas.Sandberg@ARM.com    PacketPtr packet() { return p; }
30810464SAndreas.Sandberg@ARM.com    bool operator!() const { return !p; }
30910464SAndreas.Sandberg@ARM.com    operator bool() const { return p; }
31010464SAndreas.Sandberg@ARM.com    operator bool() { return p; }
31110464SAndreas.Sandberg@ARM.com};
31210464SAndreas.Sandberg@ARM.com
31310464SAndreas.Sandberg@ARM.comuint16_t cksum(const TcpPtr &ptr);
31410464SAndreas.Sandberg@ARM.com
31510464SAndreas.Sandberg@ARM.comtypedef Range<uint16_t> SackRange;
31610464SAndreas.Sandberg@ARM.com
31710464SAndreas.Sandberg@ARM.comstruct TcpOpt : public tcp_opt
31810464SAndreas.Sandberg@ARM.com{
31910464SAndreas.Sandberg@ARM.com    uint8_t type() const { return opt_type; }
32010464SAndreas.Sandberg@ARM.com    uint8_t len() const { return TCP_OPT_TYPEONLY(type()) ? 1 : opt_len; }
32110464SAndreas.Sandberg@ARM.com
3221917SN/A    bool isopt(int opt) const { return type() == opt; }
3231917SN/A
3242SN/A    const uint8_t *data() const { return opt_data.data8; }
3252SN/A
326729SN/A    uint16_t mss() const { return ntohs(opt_data.mss); }
327707SN/A    uint8_t wscale() const { return opt_data.wscale; }
328707SN/A    bool sack(std::vector<SackRange> &vec) const;
329707SN/A    uint32_t echo() const { return ntohl(opt_data.echo); }
330707SN/A    uint32_t tsval() const { return ntohl(opt_data.timestamp[0]); }
331707SN/A    uint32_t tsecr() const { return ntohl(opt_data.timestamp[1]); }
332707SN/A    uint32_t cc() const { return ntohl(opt_data.cc); }
3337914SBrad.Beckmann@amd.com    uint8_t cksum() const{ return opt_data.cksum; }
3347914SBrad.Beckmann@amd.com    const uint8_t *md5() const { return opt_data.md5; }
3357914SBrad.Beckmann@amd.com
3367914SBrad.Beckmann@amd.com    int size() const { return len(); }
3377914SBrad.Beckmann@amd.com    const uint8_t *bytes() const { return (const uint8_t *)this; }
3387914SBrad.Beckmann@amd.com    const uint8_t *payload() const { return bytes() + size(); }
3397914SBrad.Beckmann@amd.com    uint8_t *bytes() { return (uint8_t *)this; }
3407914SBrad.Beckmann@amd.com    uint8_t *payload() { return bytes() + size(); }
3417914SBrad.Beckmann@amd.com};
3427914SBrad.Beckmann@amd.com
3432680Sktlim@umich.edu/*
3442SN/A * UDP Stuff
3452SN/A */
3462SN/Astruct UdpHdr : public udp_hdr
3472SN/A{
3482680Sktlim@umich.edu    uint16_t sport() const { return ntohs(uh_sport); }
3492SN/A    uint16_t dport() const { return ntohs(uh_dport); }
3502SN/A    uint16_t len() const { return ntohs(uh_ulen); }
3512680Sktlim@umich.edu    uint16_t sum() const { return ntohs(uh_sum); }
3522SN/A
3532SN/A    void sum(uint16_t sum) { uh_sum = htons(sum); }
3549294Sandreas.hansson@arm.com
3559294Sandreas.hansson@arm.com    int size() const { return sizeof(udp_hdr); }
3568850Sandreas.hansson@arm.com    const uint8_t *bytes() const { return (const uint8_t *)this; }
3578850Sandreas.hansson@arm.com    const uint8_t *payload() const { return bytes() + size(); }
3588850Sandreas.hansson@arm.com    uint8_t *bytes() { return (uint8_t *)this; }
3598850Sandreas.hansson@arm.com    uint8_t *payload() { return bytes() + size(); }
3609608Sandreas.hansson@arm.com};
3618850Sandreas.hansson@arm.com
3628922Swilliam.wang@arm.comclass UdpPtr
3638850Sandreas.hansson@arm.com{
3648922Swilliam.wang@arm.com  protected:
3658850Sandreas.hansson@arm.com    PacketPtr p;
3668922Swilliam.wang@arm.com    int off;
3678850Sandreas.hansson@arm.com
3688850Sandreas.hansson@arm.com    const UdpHdr *h() const { return (const UdpHdr *)(p->data + off); }
369180SN/A    UdpHdr *h() { return (UdpHdr *)(p->data + off); }
3702680Sktlim@umich.edu
371180SN/A    void set(const PacketPtr &ptr, int offset) { p = ptr; off = offset; }
3726221Snate@binkert.org    void set(const IpPtr &ptr)
3736221Snate@binkert.org    {
3746221Snate@binkert.org        if (ptr->proto() == IP_PROTO_UDP)
3752378SN/A            set(ptr.p, sizeof(eth_hdr) + ptr->hlen());
3765718Shsul@eecs.umich.edu        else
3775718Shsul@eecs.umich.edu            set(0, 0);
3785718Shsul@eecs.umich.edu    }
3795718Shsul@eecs.umich.edu
3805718Shsul@eecs.umich.edu  public:
3815718Shsul@eecs.umich.edu    UdpPtr() {}
3825718Shsul@eecs.umich.edu    UdpPtr(const IpPtr &ptr) { set(ptr); }
3836221Snate@binkert.org    UdpPtr(const UdpPtr &ptr) : p(ptr.p), off(ptr.off) {}
3845718Shsul@eecs.umich.edu
3855718Shsul@eecs.umich.edu    UdpHdr *operator->() { return h(); }
3865718Shsul@eecs.umich.edu    UdpHdr &operator*() { return *h(); }
3878779Sgblack@eecs.umich.edu    operator UdpHdr *() { return h(); }
3888779Sgblack@eecs.umich.edu
3898779Sgblack@eecs.umich.edu    const UdpHdr *operator->() const { return h(); }
390180SN/A    const UdpHdr &operator*() const { return *h(); }
391180SN/A    operator const UdpHdr *() const { return h(); }
392180SN/A
393180SN/A    const UdpPtr &operator=(const IpPtr &i) { set(i); return *this; }
3944000Ssaidi@eecs.umich.edu    const UdpPtr &operator=(const UdpPtr &t) { set(t.p, t.off); return *this; }
3954000Ssaidi@eecs.umich.edu
3964000Ssaidi@eecs.umich.edu    const PacketPtr packet() const { return p; }
3976221Snate@binkert.org    PacketPtr packet() { return p; }
3986221Snate@binkert.org    bool operator!() const { return !p; }
3996221Snate@binkert.org    operator bool() const { return p; }
4006221Snate@binkert.org    operator bool() { return p; }
4014000Ssaidi@eecs.umich.edu};
4024000Ssaidi@eecs.umich.edu
4034000Ssaidi@eecs.umich.eduuint16_t cksum(const UdpPtr &ptr);
4044000Ssaidi@eecs.umich.edu
405180SN/A/* namespace Net */ }
4062798Sktlim@umich.edu
407180SN/A#endif // __BASE_INET_HH__
4089430SAndreas.Sandberg@ARM.com