net: data reception system, fixed bugs in rtl8139
[quarnos.git] / resources / net / icmp.cpp
blob6489888b686602e96e1ae0d3ae31c41665890fda
1 #include "icmp.h"
3 #include "libs/array.h"
5 using namespace net;
7 void icmp::ping(const ipv4_addr &addr) {
8 p<icmp_packet> pkg = new icmp_packet;
9 pkg->type = 8;
10 pkg->code = 0;
11 pkg->checksum = 0;
12 pkg->id = to_be16(0xfeed);
13 pkg->sequence = to_be16(1);
15 array<u8> data(36 - sizeof(icmp_packet));
16 for (unsigned int i = 0; i < 36 - sizeof(icmp_packet); i++)
17 data[i] = '0' + i;
19 buffer buf = buffer::to_mem(pkg);
20 buf += data.to_buffer();
22 array<u16> words = array<u16>::from_buffer(buf);
23 u32 sum = 0;
24 for (int i = 0; i < 18; i++)
25 sum += words[i];
27 sum = (sum & 0xffff) + (sum >> 16);
28 sum += (sum >> 16);
30 buf.cast<icmp_packet>()->checksum = to_le16(~sum);
32 down->send_data(addr, ipv4::icmp, buf);
34 pkg.dispose();
37 void icmp::receive(const ipv4_addr &addr, const buffer &data) {
38 p<icmp_packet> request = data.cast<icmp_packet>();
40 if (request->type != 8 || request->code != 0)
41 return;
43 p<icmp_packet> pkg = new icmp_packet;
44 pkg->type = 0;
45 pkg->code = 0;
46 pkg->checksum = 0;
47 pkg->id = request->id;
48 pkg->sequence = request->sequence;
50 buffer buf = buffer::to_mem(pkg);
51 buf += data.cut_first(sizeof(icmp_packet));
53 array<u16> words = array<u16>::from_buffer(buf);
54 u32 sum = 0;
55 for (int i = 0; i < 18; i++)
56 sum += words[i];
58 sum = (sum & 0xffff) + (sum >> 16);
59 sum += (sum >> 16);
61 buf.cast<icmp_packet>()->checksum = to_le16(~sum);
63 down->send_data(addr, ipv4::icmp, buf);
65 pkg.dispose();