usb: getting string descriptors, minor improvements
[quarnos.git] / resources / net / icmp.cpp
bloba7b43dba0c95a73ff013a99e6b2ce562bde8ab67
1 #include "icmp.h"
3 #include "ipv4_packet.h"
5 #include "libs/array.h"
7 using namespace net;
9 void icmp::ping(const ipv4_addr &addr) {
10 p<icmp_packet> pkg = new icmp_packet;
11 pkg->type = 8;
12 pkg->code = 0;
13 pkg->checksum = 0;
14 pkg->id = to_be16(0xfeed);
15 pkg->sequence = to_be16(1);
17 array<u8> data(36 - sizeof(icmp_packet));
18 for (unsigned int i = 0; i < 36 - sizeof(icmp_packet); i++)
19 data[i] = '0' + i;
21 buffer buf = buffer::to_mem(pkg);
22 buf += data.to_buffer();
24 array<u16> words = array<u16>::from_buffer(buf);
25 u32 sum = 0;
26 for (int i = 0; i < words.length(); i++)
27 sum += words[i];
29 sum = (sum & 0xffff) + (sum >> 16);
30 sum += (sum >> 16);
32 buf.cast<icmp_packet>()->checksum = to_le16(~sum);
34 down->send_data(addr, ipv4_packet::p_icmp, buf);
36 pkg.dispose();
39 void icmp::receive(const ipv4_addr &addr, const buffer &data) {
40 p<icmp_packet> request = data.cast<icmp_packet>();
42 if (request->type != 8 || request->code != 0)
43 return;
45 p<icmp_packet> pkg = new icmp_packet;
46 pkg->type = 0;
47 pkg->code = 0;
48 pkg->checksum = 0;
49 pkg->id = request->id;
50 pkg->sequence = request->sequence;
52 buffer buf = buffer::to_mem(pkg);
53 buf += data.cut_first(sizeof(icmp_packet));
55 array<u16> words = array<u16>::from_buffer(buf);
56 u32 sum = 0;
57 for (int i = 0; i < words.length(); i++)
58 sum += words[i];
60 sum = (sum & 0xffff) + (sum >> 16);
61 sum += (sum >> 16);
63 buf.cast<icmp_packet>()->checksum = to_le16(~sum);
65 down->send_data(addr, ipv4_packet::p_icmp, buf);
67 request.dispose();