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 *)ð_src; } 1062367SN/A const EthAddr &dst() const { return *(EthAddr *)ð_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