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. * \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 dst() { return Ipv4_address(&_dst_addr); }
Ipv4_address src() { return Ipv4_address(&_src_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 dst_port() { return host_to_big_endian(_dst_port); }
Genode::uint16_t length() { return host_to_big_endian(_length); } Genode::uint16_t length() { return host_to_big_endian(_length); }
Genode::uint16_t checksum() { return host_to_big_endian(_checksum); } 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))) if (Genode::memcmp(eth->dst().addr, _mac.addr, sizeof(_mac.addr)))
return Measurement::UNKNOWN; 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)); sizeof(Ethernet_frame));
if (ip->protocol() != Udp_packet::IP_ID) if (ip->protocol() != Udp_packet::IP_ID)
return Measurement::UNKNOWN; 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)); - sizeof(Ipv4_packet));
Genode::uint8_t magic [] = "Hello world! Genode is greeting."; 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::FOR_US;
return Measurement::IS_MAGIC; 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) bool Session_component::handle_arp(Ethernet_frame *eth, Genode::size_t size)
{ {
Arp_packet *arp = 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() && if (arp->ethernet_ipv4() &&
arp->opcode() == Arp_packet::REQUEST) { 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) bool Session_component::handle_ip(Ethernet_frame *eth, Genode::size_t size)
{ {
Ipv4_packet *ip = 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) 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)); Udp_packet(size - sizeof(Ipv4_packet));
if (Dhcp_packet::is_dhcp(udp)) { 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)); Dhcp_packet(size - sizeof(Ipv4_packet) - sizeof(Udp_packet));
if (dhcp->op() == Dhcp_packet::REQUEST) { if (dhcp->op() == Dhcp_packet::REQUEST) {
dhcp->broadcast(true); dhcp->broadcast(true);

View File

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