3 #include "libs/array.h"
7 void icmp::ping(const ipv4_addr
&addr
) {
8 p
<icmp_packet
> pkg
= new icmp_packet
;
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
++)
19 buffer buf
= buffer::to_mem(pkg
);
20 buf
+= data
.to_buffer();
22 array
<u16
> words
= array
<u16
>::from_buffer(buf
);
24 for (int i
= 0; i
< 18; i
++)
27 sum
= (sum
& 0xffff) + (sum
>> 16);
30 buf
.cast
<icmp_packet
>()->checksum
= to_le16(~sum
);
32 down
->send_data(addr
, ipv4::icmp
, buf
);
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)
43 p
<icmp_packet
> pkg
= new icmp_packet
;
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
);
55 for (int i
= 0; i
< 18; i
++)
58 sum
= (sum
& 0xffff) + (sum
>> 16);
61 buf
.cast
<icmp_packet
>()->checksum
= to_le16(~sum
);
63 down
->send_data(addr
, ipv4::icmp
, buf
);