1 #ifndef _IPV4_PACKET_H_
2 #define _IPV4_PACKET_H_
4 #include "libs/array.h"
6 #include "arch/low/general.h"
7 #include "packet_builder.h"
10 class ipv4_packet
: public packet_builder
{
13 default_version_size
= 0x45,
29 } __attribute__((packed
));
31 mutable p
<packet
> pkg
;
35 ipv4_packet() : pkg(new packet
) { }
40 buffer
generate() const {
41 /* Set default values */
42 pkg
->version_size
= default_version_size
;
43 pkg
->service
= default_service
;
44 pkg
->ttl
= default_ttl
;
45 pkg
->flags_offset
= to_le16(0x40);
47 /* Count packet length */
48 pkg
->length
= to_be16(data
.get_size() + sizeof(packet
));
51 array
<u16
> words
= array
<u16
>::from_buffer(buffer::to_mem(pkg
));
53 for (unsigned int i
= 0; i
< sizeof(packet
) / 2; i
++)
56 sum
= (sum
& 0xffff) + (sum
>> 16);
59 pkg
->checksum
= to_le16(~sum
);
61 buffer buf
= buffer::to_mem(pkg
);
67 void add_data(const buffer
&x
) {
77 void set_ptype(protocol pt
) {
81 void set_source_paddr(const ipv4_addr
&addr
) {
82 pkg
->src
= addr
.to_be();
85 void set_target_paddr(const ipv4_addr
&addr
) {
86 pkg
->dst
= addr
.to_be();
89 ipv4_packet(const buffer
&x
) : pkg(x
.cast
<packet
>()), data(x
) { }
91 buffer
get_data() const {
92 return data
.get_next(from_be16(pkg
->length
)).cut_first(sizeof(packet
));
95 protocol
get_ptype() const {
96 return (protocol
)pkg
->prot
;
99 ipv4_addr
get_source_paddr() const {
100 return ipv4_addr::from_be(pkg
->src
);
103 ipv4_addr
get_target_paddr() const {
104 return ipv4_addr::from_be(pkg
->dst
);