inet.hh revision 7811
12SN/A/* 21762SN/A * Copyright (c) 2002-2005 The Regents of The University of Michigan 37778Sgblack@eecs.umich.edu * Copyright (c) 2010 Advanced Micro Devices, Inc. 42SN/A * All rights reserved. 52SN/A * 62SN/A * Redistribution and use in source and binary forms, with or without 72SN/A * modification, are permitted provided that the following conditions are 82SN/A * met: redistributions of source code must retain the above copyright 92SN/A * notice, this list of conditions and the following disclaimer; 102SN/A * redistributions in binary form must reproduce the above copyright 112SN/A * notice, this list of conditions and the following disclaimer in the 122SN/A * documentation and/or other materials provided with the distribution; 132SN/A * neither the name of the copyright holders nor the names of its 142SN/A * contributors may be used to endorse or promote products derived from 152SN/A * this software without specific prior written permission. 162SN/A * 172SN/A * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 182SN/A * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 192SN/A * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 202SN/A * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 212SN/A * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 222SN/A * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 232SN/A * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 242SN/A * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 252SN/A * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 262SN/A * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 272SN/A * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 282665Ssaidi@eecs.umich.edu * 292665Ssaidi@eecs.umich.edu * Authors: Nathan Binkert 302665Ssaidi@eecs.umich.edu * Steve Reinhardt 317778Sgblack@eecs.umich.edu * Gabe Black 322SN/A */ 332SN/A 341078SN/A#ifndef __BASE_INET_HH__ 351078SN/A#define __BASE_INET_HH__ 361078SN/A 371114SN/A#include <iosfwd> 381078SN/A#include <string> 391114SN/A#include <utility> 401114SN/A#include <vector> 411114SN/A 421114SN/A#include "base/range.hh" 436216Snate@binkert.org#include "base/types.hh" 441114SN/A#include "dev/etherpkt.hh" 451078SN/A 461078SN/A#include "dnet/os.h" 471078SN/A#include "dnet/eth.h" 481078SN/A#include "dnet/ip.h" 491078SN/A#include "dnet/ip6.h" 501078SN/A#include "dnet/addr.h" 511078SN/A#include "dnet/arp.h" 521078SN/A#include "dnet/icmp.h" 531078SN/A#include "dnet/tcp.h" 541078SN/A#include "dnet/udp.h" 551078SN/A#include "dnet/intf.h" 561078SN/A#include "dnet/route.h" 571078SN/A#include "dnet/fw.h" 581078SN/A#include "dnet/blob.h" 591078SN/A#include "dnet/rand.h" 602SN/A 611114SN/Anamespace Net { 622SN/A 631114SN/A/* 641114SN/A * Ethernet Stuff 651114SN/A */ 661114SN/Astruct EthAddr : protected eth_addr 671114SN/A{ 681114SN/A protected: 691114SN/A void parse(const std::string &addr); 701078SN/A 711114SN/A public: 721114SN/A EthAddr(); 731114SN/A EthAddr(const uint8_t ea[ETH_ADDR_LEN]); 741114SN/A EthAddr(const eth_addr &ea); 751114SN/A EthAddr(const std::string &addr); 761114SN/A const EthAddr &operator=(const eth_addr &ea); 771114SN/A const EthAddr &operator=(const std::string &addr); 781079SN/A 791114SN/A int size() const { return sizeof(eth_addr); } 801114SN/A 811114SN/A const uint8_t *bytes() const { return &data[0]; } 821114SN/A uint8_t *bytes() { return &data[0]; } 831114SN/A 841114SN/A const uint8_t *addr() const { return &data[0]; } 851114SN/A bool unicast() const { return data[0] == 0x00; } 861114SN/A bool multicast() const { return data[0] == 0x01; } 871114SN/A bool broadcast() const { return data[0] == 0xff; } 881114SN/A std::string string() const; 891137SN/A 901137SN/A operator uint64_t() const 911137SN/A { 921137SN/A uint64_t reg = 0; 931137SN/A reg |= ((uint64_t)data[0]) << 40; 941137SN/A reg |= ((uint64_t)data[1]) << 32; 951137SN/A reg |= ((uint64_t)data[2]) << 24; 961137SN/A reg |= ((uint64_t)data[3]) << 16; 971137SN/A reg |= ((uint64_t)data[4]) << 8; 981137SN/A reg |= ((uint64_t)data[5]) << 0; 991137SN/A return reg; 1001137SN/A } 1011137SN/A 1021114SN/A}; 1031114SN/A 1041114SN/Astd::ostream &operator<<(std::ostream &stream, const EthAddr &ea); 1051114SN/Abool operator==(const EthAddr &left, const EthAddr &right); 1061114SN/A 1071114SN/Astruct EthHdr : public eth_hdr 1081078SN/A{ 1091078SN/A uint16_t type() const { return ntohs(eth_type); } 1101114SN/A const EthAddr &src() const { return *(EthAddr *)ð_src; } 1111114SN/A const EthAddr &dst() const { return *(EthAddr *)ð_dst; } 1121079SN/A 1131114SN/A int size() const { return sizeof(eth_hdr); } 1141079SN/A 1151079SN/A const uint8_t *bytes() const { return (const uint8_t *)this; } 1161079SN/A const uint8_t *payload() const { return bytes() + size(); } 1171079SN/A uint8_t *bytes() { return (uint8_t *)this; } 1181079SN/A uint8_t *payload() { return bytes() + size(); } 1191078SN/A}; 1201078SN/A 1211114SN/Aclass EthPtr 1221114SN/A{ 1231114SN/A protected: 1241114SN/A friend class IpPtr; 1252566SN/A EthPacketPtr p; 1261114SN/A 1271114SN/A public: 1281114SN/A EthPtr() {} 1292566SN/A EthPtr(const EthPacketPtr &ptr) : p(ptr) { } 1301114SN/A 1311114SN/A EthHdr *operator->() { return (EthHdr *)p->data; } 1321114SN/A EthHdr &operator*() { return *(EthHdr *)p->data; } 1331114SN/A operator EthHdr *() { return (EthHdr *)p->data; } 1341114SN/A 1351114SN/A const EthHdr *operator->() const { return (const EthHdr *)p->data; } 1361114SN/A const EthHdr &operator*() const { return *(const EthHdr *)p->data; } 1371114SN/A operator const EthHdr *() const { return (const EthHdr *)p->data; } 1381114SN/A 1392566SN/A const EthPtr &operator=(const EthPacketPtr &ptr) { p = ptr; return *this; } 1401114SN/A 1412566SN/A const EthPacketPtr packet() const { return p; } 1422566SN/A EthPacketPtr packet() { return p; } 1431114SN/A bool operator!() const { return !p; } 1441114SN/A operator bool() const { return p; } 1455782Ssaidi@eecs.umich.edu int off() const { return 0; } 1465782Ssaidi@eecs.umich.edu int pstart() const { return off() + ((const EthHdr*)p->data)->size(); } 1471114SN/A}; 1481114SN/A 1491114SN/A/* 1501114SN/A * IP Stuff 1511114SN/A */ 1527777Sgblack@eecs.umich.edustruct IpAddress 1537777Sgblack@eecs.umich.edu{ 1547777Sgblack@eecs.umich.edu protected: 1557777Sgblack@eecs.umich.edu uint32_t _ip; 1567777Sgblack@eecs.umich.edu 1577777Sgblack@eecs.umich.edu public: 1587777Sgblack@eecs.umich.edu IpAddress() : _ip(0) 1597777Sgblack@eecs.umich.edu {} 1607777Sgblack@eecs.umich.edu IpAddress(const uint32_t __ip) : _ip(__ip) 1617777Sgblack@eecs.umich.edu {} 1627777Sgblack@eecs.umich.edu 1637777Sgblack@eecs.umich.edu uint32_t ip() const { return _ip; } 1647777Sgblack@eecs.umich.edu 1657777Sgblack@eecs.umich.edu std::string string() const; 1667777Sgblack@eecs.umich.edu}; 1677777Sgblack@eecs.umich.edu 1687777Sgblack@eecs.umich.edustd::ostream &operator<<(std::ostream &stream, const IpAddress &ia); 1697777Sgblack@eecs.umich.edubool operator==(const IpAddress &left, const IpAddress &right); 1707777Sgblack@eecs.umich.edu 1717777Sgblack@eecs.umich.edustruct IpNetmask : public IpAddress 1727777Sgblack@eecs.umich.edu{ 1737777Sgblack@eecs.umich.edu protected: 1747777Sgblack@eecs.umich.edu uint8_t _netmask; 1757777Sgblack@eecs.umich.edu 1767777Sgblack@eecs.umich.edu public: 1777777Sgblack@eecs.umich.edu IpNetmask() : IpAddress(), _netmask(0) 1787777Sgblack@eecs.umich.edu {} 1797777Sgblack@eecs.umich.edu IpNetmask(const uint32_t __ip, const uint8_t __netmask) : 1807777Sgblack@eecs.umich.edu IpAddress(__ip), _netmask(__netmask) 1817777Sgblack@eecs.umich.edu {} 1827777Sgblack@eecs.umich.edu 1837777Sgblack@eecs.umich.edu uint8_t netmask() const { return _netmask; } 1847777Sgblack@eecs.umich.edu 1857777Sgblack@eecs.umich.edu std::string string() const; 1867777Sgblack@eecs.umich.edu}; 1877777Sgblack@eecs.umich.edu 1887777Sgblack@eecs.umich.edustd::ostream &operator<<(std::ostream &stream, const IpNetmask &in); 1897777Sgblack@eecs.umich.edubool operator==(const IpNetmask &left, const IpNetmask &right); 1907777Sgblack@eecs.umich.edu 1917777Sgblack@eecs.umich.edustruct IpWithPort : public IpAddress 1927777Sgblack@eecs.umich.edu{ 1937777Sgblack@eecs.umich.edu protected: 1947777Sgblack@eecs.umich.edu uint16_t _port; 1957777Sgblack@eecs.umich.edu 1967777Sgblack@eecs.umich.edu public: 1977777Sgblack@eecs.umich.edu IpWithPort() : IpAddress(), _port(0) 1987777Sgblack@eecs.umich.edu {} 1997777Sgblack@eecs.umich.edu IpWithPort(const uint32_t __ip, const uint16_t __port) : 2007777Sgblack@eecs.umich.edu IpAddress(__ip), _port(__port) 2017777Sgblack@eecs.umich.edu {} 2027777Sgblack@eecs.umich.edu 2037777Sgblack@eecs.umich.edu uint8_t port() const { return _port; } 2047777Sgblack@eecs.umich.edu 2057777Sgblack@eecs.umich.edu std::string string() const; 2067777Sgblack@eecs.umich.edu}; 2077777Sgblack@eecs.umich.edu 2087777Sgblack@eecs.umich.edustd::ostream &operator<<(std::ostream &stream, const IpWithPort &iwp); 2097777Sgblack@eecs.umich.edubool operator==(const IpWithPort &left, const IpWithPort &right); 2107777Sgblack@eecs.umich.edu 2111114SN/Astruct IpOpt; 2121114SN/Astruct IpHdr : public ip_hdr 2131078SN/A{ 2141078SN/A uint8_t version() const { return ip_v; } 2151092SN/A uint8_t hlen() const { return ip_hl * 4; } 2161078SN/A uint8_t tos() const { return ip_tos; } 2171078SN/A uint16_t len() const { return ntohs(ip_len); } 2181078SN/A uint16_t id() const { return ntohs(ip_id); } 2191078SN/A uint16_t frag_flags() const { return ntohs(ip_off) >> 13; } 2201078SN/A uint16_t frag_off() const { return ntohs(ip_off) & 0x1fff; } 2211078SN/A uint8_t ttl() const { return ip_ttl; } 2221078SN/A uint8_t proto() const { return ip_p; } 2231092SN/A uint16_t sum() const { return ip_sum; } 2241078SN/A uint32_t src() const { return ntohl(ip_src); } 2251078SN/A uint32_t dst() const { return ntohl(ip_dst); } 2261078SN/A 2271092SN/A void sum(uint16_t sum) { ip_sum = sum; } 2285761Ssaidi@eecs.umich.edu void id(uint16_t _id) { ip_id = htons(_id); } 2295761Ssaidi@eecs.umich.edu void len(uint16_t _len) { ip_len = htons(_len); } 2305761Ssaidi@eecs.umich.edu 2311078SN/A 2321114SN/A bool options(std::vector<const IpOpt *> &vec) const; 2331079SN/A 2341079SN/A int size() const { return hlen(); } 2351079SN/A const uint8_t *bytes() const { return (const uint8_t *)this; } 2361079SN/A const uint8_t *payload() const { return bytes() + size(); } 2371079SN/A uint8_t *bytes() { return (uint8_t *)this; } 2381079SN/A uint8_t *payload() { return bytes() + size(); } 2391078SN/A}; 2401078SN/A 2411114SN/Aclass IpPtr 2421114SN/A{ 2431114SN/A protected: 2441114SN/A friend class TcpPtr; 2451114SN/A friend class UdpPtr; 2462566SN/A EthPacketPtr p; 2471114SN/A 2482566SN/A void set(const EthPacketPtr &ptr) 2491114SN/A { 2505484Snate@binkert.org p = 0; 2515484Snate@binkert.org 2525484Snate@binkert.org if (ptr) { 2535484Snate@binkert.org EthHdr *eth = (EthHdr *)ptr->data; 2545484Snate@binkert.org if (eth->type() == ETH_TYPE_IP) 2555484Snate@binkert.org p = ptr; 2565484Snate@binkert.org } 2571114SN/A } 2581114SN/A 2591114SN/A public: 2605484Snate@binkert.org IpPtr() : p(0) {} 2615484Snate@binkert.org IpPtr(const EthPacketPtr &ptr) : p(0) { set(ptr); } 2625484Snate@binkert.org IpPtr(const EthPtr &ptr) : p(0) { set(ptr.p); } 2631114SN/A IpPtr(const IpPtr &ptr) : p(ptr.p) { } 2641114SN/A 2655484Snate@binkert.org IpHdr *get() { return (IpHdr *)(p->data + sizeof(eth_hdr)); } 2665484Snate@binkert.org IpHdr *operator->() { return get(); } 2675484Snate@binkert.org IpHdr &operator*() { return *get(); } 2681114SN/A 2695484Snate@binkert.org const IpHdr *get() const 2705484Snate@binkert.org { return (const IpHdr *)(p->data + sizeof(eth_hdr)); } 2715484Snate@binkert.org const IpHdr *operator->() const { return get(); } 2725484Snate@binkert.org const IpHdr &operator*() const { return *get(); } 2731114SN/A 2742566SN/A const IpPtr &operator=(const EthPacketPtr &ptr) { set(ptr); return *this; } 2751114SN/A const IpPtr &operator=(const EthPtr &ptr) { set(ptr.p); return *this; } 2761114SN/A const IpPtr &operator=(const IpPtr &ptr) { p = ptr.p; return *this; } 2771114SN/A 2782566SN/A const EthPacketPtr packet() const { return p; } 2792566SN/A EthPacketPtr packet() { return p; } 2801114SN/A bool operator!() const { return !p; } 2811114SN/A operator bool() const { return p; } 2825782Ssaidi@eecs.umich.edu int off() const { return sizeof(eth_hdr); } 2835782Ssaidi@eecs.umich.edu int pstart() const { return off() + get()->size(); } 2841114SN/A}; 2851114SN/A 2861114SN/Auint16_t cksum(const IpPtr &ptr); 2871114SN/A 2881114SN/Astruct IpOpt : public ip_opt 2891114SN/A{ 2901114SN/A uint8_t type() const { return opt_type; } 2911114SN/A uint8_t typeNumber() const { return IP_OPT_NUMBER(opt_type); } 2921114SN/A uint8_t typeClass() const { return IP_OPT_CLASS(opt_type); } 2931114SN/A uint8_t typeCopied() const { return IP_OPT_COPIED(opt_type); } 2941114SN/A uint8_t len() const { return IP_OPT_TYPEONLY(type()) ? 1 : opt_len; } 2951114SN/A 2961114SN/A bool isNumber(int num) const { return typeNumber() == IP_OPT_NUMBER(num); } 2971114SN/A bool isClass(int cls) const { return typeClass() == IP_OPT_CLASS(cls); } 2981114SN/A bool isCopied(int cpy) const { return typeCopied() == IP_OPT_COPIED(cpy); } 2991114SN/A 3001114SN/A const uint8_t *data() const { return opt_data.data8; } 3011114SN/A void sec(ip_opt_data_sec &sec) const; 3021114SN/A void lsrr(ip_opt_data_rr &rr) const; 3031114SN/A void ssrr(ip_opt_data_rr &rr) const; 3041114SN/A void ts(ip_opt_data_ts &ts) const; 3051114SN/A uint16_t satid() const { return ntohs(opt_data.satid); } 3061114SN/A uint16_t mtup() const { return ntohs(opt_data.mtu); } 3071114SN/A uint16_t mtur() const { return ntohs(opt_data.mtu); } 3081114SN/A void tr(ip_opt_data_tr &tr) const; 3091114SN/A const uint32_t *addext() const { return &opt_data.addext[0]; } 3101114SN/A uint16_t rtralt() const { return ntohs(opt_data.rtralt); } 3111114SN/A void sdb(std::vector<uint32_t> &vec) const; 3121114SN/A}; 3131114SN/A 3141114SN/A/* 3151114SN/A * TCP Stuff 3161114SN/A */ 3171114SN/Astruct TcpOpt; 3181114SN/Astruct TcpHdr : public tcp_hdr 3191078SN/A{ 3201078SN/A uint16_t sport() const { return ntohs(th_sport); } 3211078SN/A uint16_t dport() const { return ntohs(th_dport); } 3221078SN/A uint32_t seq() const { return ntohl(th_seq); } 3231078SN/A uint32_t ack() const { return ntohl(th_ack); } 3241078SN/A uint8_t off() const { return th_off; } 3251078SN/A uint8_t flags() const { return th_flags & 0x3f; } 3261078SN/A uint16_t win() const { return ntohs(th_win); } 3271092SN/A uint16_t sum() const { return th_sum; } 3281078SN/A uint16_t urp() const { return ntohs(th_urp); } 3291078SN/A 3301092SN/A void sum(uint16_t sum) { th_sum = sum; } 3315761Ssaidi@eecs.umich.edu void seq(uint32_t _seq) { th_seq = htonl(_seq); } 3325761Ssaidi@eecs.umich.edu void flags(uint8_t _flags) { th_flags = _flags; } 3331078SN/A 3341114SN/A bool options(std::vector<const TcpOpt *> &vec) const; 3351114SN/A 3361079SN/A int size() const { return off(); } 3371079SN/A const uint8_t *bytes() const { return (const uint8_t *)this; } 3381079SN/A const uint8_t *payload() const { return bytes() + size(); } 3391079SN/A uint8_t *bytes() { return (uint8_t *)this; } 3401079SN/A uint8_t *payload() { return bytes() + size(); } 3411078SN/A}; 3421078SN/A 3431114SN/Aclass TcpPtr 3441114SN/A{ 3451114SN/A protected: 3462566SN/A EthPacketPtr p; 3475782Ssaidi@eecs.umich.edu int _off; 3481114SN/A 3495782Ssaidi@eecs.umich.edu void set(const EthPacketPtr &ptr, int offset) { p = ptr; _off = offset; } 3501114SN/A void set(const IpPtr &ptr) 3511114SN/A { 3525484Snate@binkert.org if (ptr && ptr->proto() == IP_PROTO_TCP) 3531114SN/A set(ptr.p, sizeof(eth_hdr) + ptr->hlen()); 3541114SN/A else 3551114SN/A set(0, 0); 3561114SN/A } 3571114SN/A 3581114SN/A public: 3595782Ssaidi@eecs.umich.edu TcpPtr() : p(0), _off(0) {} 3605782Ssaidi@eecs.umich.edu TcpPtr(const IpPtr &ptr) : p(0), _off(0) { set(ptr); } 3615782Ssaidi@eecs.umich.edu TcpPtr(const TcpPtr &ptr) : p(ptr.p), _off(ptr._off) {} 3621114SN/A 3635782Ssaidi@eecs.umich.edu TcpHdr *get() { return (TcpHdr *)(p->data + _off); } 3645484Snate@binkert.org TcpHdr *operator->() { return get(); } 3655484Snate@binkert.org TcpHdr &operator*() { return *get(); } 3661114SN/A 3675782Ssaidi@eecs.umich.edu const TcpHdr *get() const { return (const TcpHdr *)(p->data + _off); } 3685484Snate@binkert.org const TcpHdr *operator->() const { return get(); } 3695484Snate@binkert.org const TcpHdr &operator*() const { return *get(); } 3701114SN/A 3711114SN/A const TcpPtr &operator=(const IpPtr &i) { set(i); return *this; } 3725782Ssaidi@eecs.umich.edu const TcpPtr &operator=(const TcpPtr &t) { set(t.p, t._off); return *this; } 3731114SN/A 3742566SN/A const EthPacketPtr packet() const { return p; } 3752566SN/A EthPacketPtr packet() { return p; } 3761114SN/A bool operator!() const { return !p; } 3771114SN/A operator bool() const { return p; } 3785782Ssaidi@eecs.umich.edu int off() const { return _off; } 3795782Ssaidi@eecs.umich.edu int pstart() const { return off() + get()->size(); } 3801114SN/A}; 3811114SN/A 3821114SN/Auint16_t cksum(const TcpPtr &ptr); 3831114SN/A 3841114SN/Atypedef Range<uint16_t> SackRange; 3851114SN/A 3861114SN/Astruct TcpOpt : public tcp_opt 3871114SN/A{ 3881114SN/A uint8_t type() const { return opt_type; } 3891114SN/A uint8_t len() const { return TCP_OPT_TYPEONLY(type()) ? 1 : opt_len; } 3901114SN/A 3911114SN/A bool isopt(int opt) const { return type() == opt; } 3921114SN/A 3931114SN/A const uint8_t *data() const { return opt_data.data8; } 3941114SN/A 3951114SN/A uint16_t mss() const { return ntohs(opt_data.mss); } 3961114SN/A uint8_t wscale() const { return opt_data.wscale; } 3971114SN/A bool sack(std::vector<SackRange> &vec) const; 3981114SN/A uint32_t echo() const { return ntohl(opt_data.echo); } 3991114SN/A uint32_t tsval() const { return ntohl(opt_data.timestamp[0]); } 4001114SN/A uint32_t tsecr() const { return ntohl(opt_data.timestamp[1]); } 4011114SN/A uint32_t cc() const { return ntohl(opt_data.cc); } 4021114SN/A uint8_t cksum() const{ return opt_data.cksum; } 4031114SN/A const uint8_t *md5() const { return opt_data.md5; } 4041114SN/A 4051114SN/A int size() const { return len(); } 4061114SN/A const uint8_t *bytes() const { return (const uint8_t *)this; } 4071114SN/A const uint8_t *payload() const { return bytes() + size(); } 4081114SN/A uint8_t *bytes() { return (uint8_t *)this; } 4091114SN/A uint8_t *payload() { return bytes() + size(); } 4101114SN/A}; 4111114SN/A 4121114SN/A/* 4131114SN/A * UDP Stuff 4141114SN/A */ 4151114SN/Astruct UdpHdr : public udp_hdr 4161078SN/A{ 4171078SN/A uint16_t sport() const { return ntohs(uh_sport); } 4181078SN/A uint16_t dport() const { return ntohs(uh_dport); } 4191078SN/A uint16_t len() const { return ntohs(uh_ulen); } 4201171SN/A uint16_t sum() const { return uh_sum; } 4211078SN/A 4221171SN/A void sum(uint16_t sum) { uh_sum = sum; } 4235761Ssaidi@eecs.umich.edu void len(uint16_t _len) { uh_ulen = htons(_len); } 4241078SN/A 4251114SN/A int size() const { return sizeof(udp_hdr); } 4261079SN/A const uint8_t *bytes() const { return (const uint8_t *)this; } 4271079SN/A const uint8_t *payload() const { return bytes() + size(); } 4281079SN/A uint8_t *bytes() { return (uint8_t *)this; } 4291079SN/A uint8_t *payload() { return bytes() + size(); } 4301078SN/A}; 4311078SN/A 4321114SN/Aclass UdpPtr 4331114SN/A{ 4341114SN/A protected: 4352566SN/A EthPacketPtr p; 4365782Ssaidi@eecs.umich.edu int _off; 4371114SN/A 4385782Ssaidi@eecs.umich.edu void set(const EthPacketPtr &ptr, int offset) { p = ptr; _off = offset; } 4391114SN/A void set(const IpPtr &ptr) 4401114SN/A { 4415484Snate@binkert.org if (ptr && ptr->proto() == IP_PROTO_UDP) 4421114SN/A set(ptr.p, sizeof(eth_hdr) + ptr->hlen()); 4431114SN/A else 4441114SN/A set(0, 0); 4451114SN/A } 4461114SN/A 4471114SN/A public: 4485782Ssaidi@eecs.umich.edu UdpPtr() : p(0), _off(0) {} 4495782Ssaidi@eecs.umich.edu UdpPtr(const IpPtr &ptr) : p(0), _off(0) { set(ptr); } 4505782Ssaidi@eecs.umich.edu UdpPtr(const UdpPtr &ptr) : p(ptr.p), _off(ptr._off) {} 4511114SN/A 4525782Ssaidi@eecs.umich.edu UdpHdr *get() { return (UdpHdr *)(p->data + _off); } 4535484Snate@binkert.org UdpHdr *operator->() { return get(); } 4545484Snate@binkert.org UdpHdr &operator*() { return *get(); } 4551114SN/A 4565782Ssaidi@eecs.umich.edu const UdpHdr *get() const { return (const UdpHdr *)(p->data + _off); } 4575484Snate@binkert.org const UdpHdr *operator->() const { return get(); } 4585484Snate@binkert.org const UdpHdr &operator*() const { return *get(); } 4591114SN/A 4601114SN/A const UdpPtr &operator=(const IpPtr &i) { set(i); return *this; } 4615782Ssaidi@eecs.umich.edu const UdpPtr &operator=(const UdpPtr &t) { set(t.p, t._off); return *this; } 4621114SN/A 4632566SN/A const EthPacketPtr packet() const { return p; } 4642566SN/A EthPacketPtr packet() { return p; } 4651114SN/A bool operator!() const { return !p; } 4661114SN/A operator bool() const { return p; } 4675782Ssaidi@eecs.umich.edu int off() const { return _off; } 4685782Ssaidi@eecs.umich.edu int pstart() const { return off() + get()->size(); } 4691114SN/A}; 4701114SN/A 4711114SN/Auint16_t cksum(const UdpPtr &ptr); 4721114SN/A 4735782Ssaidi@eecs.umich.eduint hsplit(const EthPacketPtr &ptr); 4745782Ssaidi@eecs.umich.edu 4757811Ssteve.reinhardt@amd.com} // namespace Net 4761114SN/A 4771078SN/A#endif // __BASE_INET_HH__ 478