3 #include "ipv4_packet.h"
5 #include "libs/array.h"
9 void icmp::ping(const ipv4_addr
&addr
) {
10 p
<icmp_packet
> pkg
= new icmp_packet
;
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
++)
21 buffer buf
= buffer::to_mem(pkg
);
22 buf
+= data
.to_buffer();
24 array
<u16
> words
= array
<u16
>::from_buffer(buf
);
26 for (int i
= 0; i
< words
.length(); i
++)
29 sum
= (sum
& 0xffff) + (sum
>> 16);
32 buf
.cast
<icmp_packet
>()->checksum
= to_le16(~sum
);
34 down
->send_data(addr
, ipv4_packet::p_icmp
, buf
);
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)
45 p
<icmp_packet
> pkg
= new icmp_packet
;
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
);
57 for (int i
= 0; i
< words
.length(); i
++)
60 sum
= (sum
& 0xffff) + (sum
>> 16);
63 buf
.cast
<icmp_packet
>()->checksum
= to_le16(~sum
);
65 down
->send_data(addr
, ipv4_packet::p_icmp
, buf
);