nic_router: fix Tcp_packet header fields

data_offset and NS flag were incorrectly read due to missing endianess
conversion. Also fix name of CWR flag.

Fixes genodelabs/genode#4227

genodelabs/genode#4227
This commit is contained in:
Johannes Schlatow 2021-07-20 18:32:46 +02:00 committed by Christian Helmuth
parent ee045a68cc
commit 2afb7c5567
2 changed files with 15 additions and 17 deletions

View File

@ -46,10 +46,7 @@ class Net::Tcp_packet
uint16_t _dst_port;
uint32_t _seq_nr;
uint32_t _ack_nr;
unsigned _data_offset : 4;
unsigned _reserved : 3;
unsigned _flags_msb : 1;
uint8_t _flags_lsb;
uint16_t _flags;
uint16_t _window_size;
uint16_t _checksum;
uint16_t _urgent_ptr;
@ -57,15 +54,16 @@ class Net::Tcp_packet
struct Flags : Genode::Register<16>
{
struct Fin : Bitfield<0, 1> { };
struct Syn : Bitfield<1, 1> { };
struct Rst : Bitfield<2, 1> { };
struct Psh : Bitfield<3, 1> { };
struct Ack : Bitfield<4, 1> { };
struct Urg : Bitfield<5, 1> { };
struct Ece : Bitfield<6, 1> { };
struct Crw : Bitfield<7, 1> { };
struct Ns : Bitfield<8, 1> { };
struct Fin : Bitfield<0, 1> { };
struct Syn : Bitfield<1, 1> { };
struct Rst : Bitfield<2, 1> { };
struct Psh : Bitfield<3, 1> { };
struct Ack : Bitfield<4, 1> { };
struct Urg : Bitfield<5, 1> { };
struct Ece : Bitfield<6, 1> { };
struct Cwr : Bitfield<7, 1> { };
struct Ns : Bitfield<8, 1> { };
struct Data_offset : Bitfield<12, 4> { };
};
public:
@ -83,14 +81,14 @@ class Net::Tcp_packet
Port dst_port() const { return Port(host_to_big_endian(_dst_port)); }
uint32_t seq_nr() const { return host_to_big_endian(_seq_nr); }
uint32_t ack_nr() const { return host_to_big_endian(_ack_nr); }
uint8_t data_offset() const { return _data_offset; }
uint16_t flags() const { return _flags_lsb | _flags_msb << 8; }
uint8_t data_offset() const { return Flags::Data_offset::get(flags()); }
uint16_t flags() const { return host_to_big_endian(_flags); }
uint16_t window_size() const { return host_to_big_endian(_window_size); }
uint16_t checksum() const { return host_to_big_endian(_checksum); }
uint16_t urgent_ptr() const { return host_to_big_endian(_urgent_ptr); }
bool ns() const { return Flags::Ns::get(flags()); };
bool ece() const { return Flags::Ece::get(flags()); };
bool crw() const { return Flags::Crw::get(flags()); };
bool cwr() const { return Flags::Cwr::get(flags()); };
bool fin() const { return Flags::Fin::get(flags()); };
bool syn() const { return Flags::Syn::get(flags()); };
bool rst() const { return Flags::Rst::get(flags()); };

View File

@ -32,7 +32,7 @@ void Net::Tcp_packet::print(Genode::Output &output) const
if (ack()) { Genode::print(output, "a"); }
if (urg()) { Genode::print(output, "u"); }
if (ece()) { Genode::print(output, "e"); }
if (crw()) { Genode::print(output, "c"); }
if (cwr()) { Genode::print(output, "c"); }
if (ns()) { Genode::print(output, "n"); }
Genode::print(output, "' ");
}