net: transform packet data accessor into template

Supports stronger typing of raw accesses and const correctness.

Issue #1915
This commit is contained in:
Christian Helmuth 2016-05-09 15:47:28 +02:00
parent 3df03fbc41
commit abed38e8ac
6 changed files with 19 additions and 14 deletions

View File

@ -137,7 +137,8 @@ class Net::Ethernet_frame
/**
* \return payload data.
*/
void *data() { return &_data; }
template <typename T> T * data() { return (T *)(_data); }
template <typename T> T const * data() const { return (T const *)(_data); }
/***********************************

View File

@ -155,7 +155,9 @@ class Net::Ipv4_packet
Ipv4_address dst() { return Ipv4_address(&_dst_addr); }
Ipv4_address src() { return Ipv4_address(&_src_addr); }
void *data() { return &_data; }
template <typename T> T const * header() const { return (T const *)(this); }
template <typename T> T * data() { return (T *)(_data); }
template <typename T> T const * data() const { return (T const *)(_data); }
/***************

View File

@ -79,7 +79,9 @@ class Net::Udp_packet
Genode::uint16_t dst_port() { return host_to_big_endian(_dst_port); }
Genode::uint16_t length() { return host_to_big_endian(_length); }
Genode::uint16_t checksum() { return host_to_big_endian(_checksum); }
void* data() { return &_data; }
template <typename T> T * data() { return (T *)(_data); }
template <typename T> T const * data() const { return (T const *)(_data); }
/***************

View File

@ -27,18 +27,18 @@ enum Measurement::status Measurement::_check(Net::Ethernet_frame * eth,
if (Genode::memcmp(eth->dst().addr, _mac.addr, sizeof(_mac.addr)))
return Measurement::UNKNOWN;
Ipv4_packet *ip = new (eth->data()) Ipv4_packet(size -
Ipv4_packet *ip = new (eth->data<void>()) Ipv4_packet(size -
sizeof(Ethernet_frame));
if (ip->protocol() != Udp_packet::IP_ID)
return Measurement::UNKNOWN;
Udp_packet *udp = new (ip->data()) Udp_packet(size - sizeof(Ethernet_frame)
Udp_packet *udp = new (ip->data<void>()) Udp_packet(size - sizeof(Ethernet_frame)
- sizeof(Ipv4_packet));
Genode::uint8_t magic [] = "Hello world! Genode is greeting.";
if (Genode::memcmp(udp->data(), magic, sizeof(magic) - 1))
if (Genode::memcmp(udp->data<void>(), magic, sizeof(magic) - 1))
return Measurement::FOR_US;
return Measurement::IS_MAGIC;
}

View File

@ -26,7 +26,7 @@ static const int verbose = 1;
bool Session_component::handle_arp(Ethernet_frame *eth, Genode::size_t size)
{
Arp_packet *arp =
new (eth->data()) Arp_packet(size - sizeof(Ethernet_frame));
new (eth->data<void>()) Arp_packet(size - sizeof(Ethernet_frame));
if (arp->ethernet_ipv4() &&
arp->opcode() == Arp_packet::REQUEST) {
@ -55,14 +55,14 @@ bool Session_component::handle_arp(Ethernet_frame *eth, Genode::size_t size)
bool Session_component::handle_ip(Ethernet_frame *eth, Genode::size_t size)
{
Ipv4_packet *ip =
new (eth->data()) Ipv4_packet(size - sizeof(Ethernet_frame));
new (eth->data<void>()) Ipv4_packet(size - sizeof(Ethernet_frame));
if (ip->protocol() == Udp_packet::IP_ID)
{
Udp_packet *udp = new (ip->data())
Udp_packet *udp = new (ip->data<void>())
Udp_packet(size - sizeof(Ipv4_packet));
if (Dhcp_packet::is_dhcp(udp)) {
Dhcp_packet *dhcp = new (udp->data())
Dhcp_packet *dhcp = new (udp->data<void>())
Dhcp_packet(size - sizeof(Ipv4_packet) - sizeof(Udp_packet));
if (dhcp->op() == Dhcp_packet::REQUEST) {
dhcp->broadcast(true);

View File

@ -24,7 +24,7 @@ using namespace Net;
bool Net::Nic::handle_arp(Ethernet_frame *eth, Genode::size_t size) {
Arp_packet *arp = new (eth->data())
Arp_packet *arp = new (eth->data<void>())
Arp_packet(size - sizeof(Ethernet_frame));
/* ignore broken packets */
@ -66,18 +66,18 @@ bool Net::Nic::handle_arp(Ethernet_frame *eth, Genode::size_t size) {
bool Net::Nic::handle_ip(Ethernet_frame *eth, Genode::size_t size) {
Ipv4_packet *ip = new (eth->data())
Ipv4_packet *ip = new (eth->data<void>())
Ipv4_packet(size - sizeof(Ethernet_frame));
/* is it an UDP packet ? */
if (ip->protocol() == Udp_packet::IP_ID)
{
Udp_packet *udp = new (ip->data())
Udp_packet *udp = new (ip->data<void>())
Udp_packet(size - sizeof(Ipv4_packet));
/* is it a DHCP packet ? */
if (Dhcp_packet::is_dhcp(udp)) {
Dhcp_packet *dhcp = new (udp->data())
Dhcp_packet *dhcp = new (udp->data<void>())
Dhcp_packet(size - sizeof(Ipv4_packet) - sizeof(Udp_packet));
/* check for DHCP ACKs containing new client ips */