]> git.llucax.com Git - z.facultad/75.74/practicos.git/blob - practicas/pipi/src/ipheader.h
IPHeader.
[z.facultad/75.74/practicos.git] / practicas / pipi / src / ipheader.h
1 #ifndef _IPHEADER_H_
2 #define _IPHEADER_H_
3
4 #include "ipaddr.h"
5 #include <string>
6 #include <ostream>
7 #include <stdint.h>
8
9 /// Dispositivo de red (capa de enlace)
10 struct IPHeader
11 {
12
13     // Campos
14     uint8_t version;
15     //TODO IHL
16     //TODO TOS
17     uint16_t total_len;
18     uint16_t id;
19     uint16_t reserved_flag: 1;
20     uint16_t df: 1;
21     uint16_t mf: 1;
22     uint16_t offset: 13;
23     uint8_t ttl;
24     uint8_t proto;
25     uint16_t checksum;
26     uint32_t src;
27     uint32_t dst;
28
29     IPHeader(uint8_t version, uint16_t total_len, uint16_t id, bool df,
30             bool mf, uint16_t offset, uint8_t ttl, uint8_t proto,
31             const IPAddr& src, const IPAddr& dst):
32         version(version), total_len(total_len), id(id), reserved_flag(0),
33         df(df), mf(mf), offset(offset), ttl(ttl), proto(proto), checksum(0),
34         src(src), dst(dst)
35     {
36         do_checksum();
37     }
38
39     IPHeader(const std::string& s)
40     {
41         *this = *((IPHeader*)s.c_str());
42     }
43
44     bool check_checksum() const
45     {
46         IPHeader iph = *this;
47         iph.checksum = 0;
48         char* raw = (char*) &iph;
49         uint16_t sum = 0;
50         for (unsigned i = 0; i < sizeof(IPHeader); ++i)
51             sum += raw[i];
52         return sum == checksum;
53     }
54
55     void do_checksum()
56     {
57         checksum = 0;
58         char* raw = (char*) this;
59         uint16_t sum = 0;
60         for (unsigned i = 0; i < sizeof(IPHeader); ++i)
61             sum += raw[i];
62         checksum = sum;
63     }
64
65 };
66
67 std::ostream& operator<<(std::ostream& os, const IPHeader& iph)
68 {
69     return os
70         << "version=" << iph.version
71         << " total_len=" << iph.total_len
72         << " id=" << iph.id
73         << " DF=" << bool(iph.df)
74         << " MF=" << bool(iph.mf)
75         << " offset=" << unsigned(iph.offset)
76         << " TTL=" << unsigned(iph.ttl)
77         << " proto=" << unsigned(iph.proto)
78         << " checksum=" << iph.checksum
79         << " src=" << IPAddr(iph.src)
80         << " dst=" << IPAddr(iph.dst);
81 }
82
83 #endif // _IPHEADER_H_
84
85 // vim: set et sw=4 sts=4 :