diff options
Diffstat (limited to 'base/inet.hh')
-rw-r--r-- | base/inet.hh | 130 |
1 files changed, 125 insertions, 5 deletions
diff --git a/base/inet.hh b/base/inet.hh index 67ac5a504..b20c90beb 100644 --- a/base/inet.hh +++ b/base/inet.hh @@ -26,12 +26,132 @@ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ -#ifndef __INET_HH__ -#define __INET_HH__ +#ifndef __BASE_INET_HH__ +#define __BASE_INET_HH__ + +#include <string> + +#include "dnet/os.h" + +#include "dnet/eth.h" +#include "dnet/ip.h" +#include "dnet/ip6.h" +#include "dnet/addr.h" +#include "dnet/arp.h" +#include "dnet/icmp.h" +#include "dnet/tcp.h" +#include "dnet/udp.h" + +#include "dnet/intf.h" +#include "dnet/route.h" +#include "dnet/fw.h" + +#include "dnet/blob.h" +#include "dnet/rand.h" #include "sim/host.hh" -uint32_t crc32be(const uint8_t *buf, size_t len); -uint32_t crc32le(const uint8_t *buf, size_t len); std::string eaddr_string(const uint8_t a[6]); -#endif // __INET_HH__ + +struct EthHdr; +struct IpHdr; +struct TcpHdr; +struct UdpHdr; + +struct EthHdr : protected eth_hdr +{ + uint16_t type() const { return ntohs(eth_type); } + + const IpHdr *ip() const + { return type() == ETH_TYPE_IP ? (const IpHdr *)payload() : 0; } + + IpHdr *ip() + { return type() == ETH_TYPE_IP ? (IpHdr *)payload() : 0; } + + bool unicast() { return eth_dst.data[0] == 0x00; } + bool multicast() { return eth_dst.data[0] == 0x01; } + bool broadcast() { return eth_dst.data[0] == 0xff; } + + int size() const { return sizeof(EthHdr); } + const uint8_t *bytes() const { return (const uint8_t *)this; } + const uint8_t *payload() const { return bytes() + size(); } + uint8_t *bytes() { return (uint8_t *)this; } + uint8_t *payload() { return bytes() + size(); } +}; + +struct IpHdr : protected ip_hdr +{ + uint8_t version() const { return ip_v; } + uint8_t hlen() const { return ip_hl; } + uint8_t tos() const { return ip_tos; } + uint16_t len() const { return ntohs(ip_len); } + uint16_t id() const { return ntohs(ip_id); } + uint16_t frag_flags() const { return ntohs(ip_off) >> 13; } + uint16_t frag_off() const { return ntohs(ip_off) & 0x1fff; } + uint8_t ttl() const { return ip_ttl; } + uint8_t proto() const { return ip_p; } + uint16_t sum() const { return ntohs(ip_sum); } + uint32_t src() const { return ntohl(ip_src); } + uint32_t dst() const { return ntohl(ip_dst); } + + void sum(uint16_t sum) { ip_sum = htons(sum); } + + uint16_t ip_cksum() const; + uint16_t tu_cksum() const; + + const TcpHdr *tcp() const + { return proto() == IP_PROTO_TCP ? (const TcpHdr *)payload() : 0; } + const UdpHdr *udp() const + { return proto() == IP_PROTO_UDP ? (const UdpHdr *)payload() : 0; } + + TcpHdr *tcp() + { return proto() == IP_PROTO_TCP ? (TcpHdr *)payload() : 0; } + UdpHdr *udp() + { return proto() == IP_PROTO_UDP ? (UdpHdr *)payload() : 0; } + + + int size() const { return hlen(); } + const uint8_t *bytes() const { return (const uint8_t *)this; } + const uint8_t *payload() const { return bytes() + size(); } + uint8_t *bytes() { return (uint8_t *)this; } + uint8_t *payload() { return bytes() + size(); } +}; + +struct TcpHdr : protected tcp_hdr +{ + uint16_t sport() const { return ntohs(th_sport); } + uint16_t dport() const { return ntohs(th_dport); } + uint32_t seq() const { return ntohl(th_seq); } + uint32_t ack() const { return ntohl(th_ack); } + uint8_t off() const { return th_off; } + uint8_t flags() const { return th_flags & 0x3f; } + uint16_t win() const { return ntohs(th_win); } + uint16_t sum() const { return ntohs(th_sum); } + uint16_t urp() const { return ntohs(th_urp); } + + void sum(uint16_t sum) { th_sum = htons(sum); } + + int size() const { return off(); } + const uint8_t *bytes() const { return (const uint8_t *)this; } + const uint8_t *payload() const { return bytes() + size(); } + uint8_t *bytes() { return (uint8_t *)this; } + uint8_t *payload() { return bytes() + size(); } +}; + +struct UdpHdr : protected udp_hdr +{ + uint16_t sport() const { return ntohs(uh_sport); } + uint16_t dport() const { return ntohs(uh_dport); } + uint16_t len() const { return ntohs(uh_ulen); } + uint16_t sum() const { return ntohs(uh_sum); } + + void sum(uint16_t sum) { uh_sum = htons(sum); } + + int size() const { return sizeof(UdpHdr); } + const uint8_t *bytes() const { return (const uint8_t *)this; } + const uint8_t *payload() const { return bytes() + size(); } + uint8_t *bytes() { return (uint8_t *)this; } + uint8_t *payload() { return bytes() + size(); } +}; + +#endif // __BASE_INET_HH__ |