]> git.llucax.com Git - z.facultad/75.74/practicos.git/blob - practicas/pipi/src/ipheader.cpp
Cosas de Distribuidos I.
[z.facultad/75.74/practicos.git] / practicas / pipi / src / ipheader.cpp
1 #include "ipheader.h"
2
3 IPHeader::IPHeader(uint8_t version, uint16_t total_len, uint16_t id, bool df,
4         bool mf, uint16_t offset, uint8_t ttl, uint8_t proto,
5         const IPAddr& src, const IPAddr& dst):
6     version(version), total_len(total_len), id(id), reserved_flag(0),
7     df(df), mf(mf), offset(offset), ttl(ttl), proto(proto), checksum(0),
8     src(src), dst(dst)
9 {
10     do_checksum();
11 }
12
13 IPHeader::IPHeader(const std::string& s)
14 {
15     *this = *((IPHeader*)s.data());
16 }
17
18 size_t IPHeader::header_len()
19 {
20     return sizeof(IPHeader);
21 }
22
23 bool IPHeader::check_checksum() const
24 {
25     IPHeader iph = *this;
26     iph.checksum = 0;
27     char* raw = (char*) &iph;
28     uint16_t sum = 0;
29     for (unsigned i = 0; i < sizeof(IPHeader); ++i)
30         sum += raw[i];
31     return sum == checksum;
32 }
33
34 void IPHeader::do_checksum()
35 {
36     checksum = 0;
37     char* raw = (char*) this;
38     uint16_t sum = 0;
39     for (unsigned i = 0; i < sizeof(IPHeader); ++i)
40         sum += raw[i];
41     checksum = sum;
42 }
43
44 std::ostream& operator<<(std::ostream& os, const IPHeader& iph)
45 {
46     return os
47         << "version=" << unsigned(iph.version)
48         << " total_len=" << iph.total_len
49         << " id=" << iph.id
50         << " DF=" << bool(iph.df)
51         << " MF=" << bool(iph.mf)
52         << " offset=" << unsigned(iph.offset)
53         << " TTL=" << unsigned(iph.ttl)
54         << " proto=" << unsigned(iph.proto)
55         << " checksum=" << iph.checksum
56         << " src=" << IPAddr(iph.src)
57         << " dst=" << IPAddr(iph.dst);
58 }
59
60 // vim: set et sw=4 sts=4 :