From abed38e8acebe695ece5b8f14437185e9b01abc7 Mon Sep 17 00:00:00 2001 From: Christian Helmuth Date: Mon, 9 May 2016 15:47:28 +0200 Subject: [PATCH] net: transform packet data accessor into template Supports stronger typing of raw accesses and const correctness. Issue #1915 --- repos/os/include/net/ethernet.h | 3 ++- repos/os/include/net/ipv4.h | 4 +++- repos/os/include/net/udp.h | 4 +++- repos/os/src/lib/net/stat.cc | 6 +++--- repos/os/src/server/nic_bridge/component.cc | 8 ++++---- repos/os/src/server/nic_bridge/nic.cc | 8 ++++---- 6 files changed, 19 insertions(+), 14 deletions(-) diff --git a/repos/os/include/net/ethernet.h b/repos/os/include/net/ethernet.h index 4a1b1818d..918b6d865 100644 --- a/repos/os/include/net/ethernet.h +++ b/repos/os/include/net/ethernet.h @@ -137,7 +137,8 @@ class Net::Ethernet_frame /** * \return payload data. */ - void *data() { return &_data; } + template T * data() { return (T *)(_data); } + template T const * data() const { return (T const *)(_data); } /*********************************** diff --git a/repos/os/include/net/ipv4.h b/repos/os/include/net/ipv4.h index 2ae537a1b..1f630f7aa 100644 --- a/repos/os/include/net/ipv4.h +++ b/repos/os/include/net/ipv4.h @@ -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 T const * header() const { return (T const *)(this); } + template T * data() { return (T *)(_data); } + template T const * data() const { return (T const *)(_data); } /*************** diff --git a/repos/os/include/net/udp.h b/repos/os/include/net/udp.h index 9d2ceef6f..ba482a2ea 100644 --- a/repos/os/include/net/udp.h +++ b/repos/os/include/net/udp.h @@ -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 T * data() { return (T *)(_data); } + template T const * data() const { return (T const *)(_data); } /*************** diff --git a/repos/os/src/lib/net/stat.cc b/repos/os/src/lib/net/stat.cc index d51c58f10..4e3e2e3f7 100644 --- a/repos/os/src/lib/net/stat.cc +++ b/repos/os/src/lib/net/stat.cc @@ -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()) 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()) 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(), magic, sizeof(magic) - 1)) return Measurement::FOR_US; return Measurement::IS_MAGIC; } diff --git a/repos/os/src/server/nic_bridge/component.cc b/repos/os/src/server/nic_bridge/component.cc index 1c3cfb0c7..7d42a9a67 100644 --- a/repos/os/src/server/nic_bridge/component.cc +++ b/repos/os/src/server/nic_bridge/component.cc @@ -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()) 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()) 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()) Udp_packet(size - sizeof(Ipv4_packet)); if (Dhcp_packet::is_dhcp(udp)) { - Dhcp_packet *dhcp = new (udp->data()) + Dhcp_packet *dhcp = new (udp->data()) Dhcp_packet(size - sizeof(Ipv4_packet) - sizeof(Udp_packet)); if (dhcp->op() == Dhcp_packet::REQUEST) { dhcp->broadcast(true); diff --git a/repos/os/src/server/nic_bridge/nic.cc b/repos/os/src/server/nic_bridge/nic.cc index 949f5a12a..3346366de 100644 --- a/repos/os/src/server/nic_bridge/nic.cc +++ b/repos/os/src/server/nic_bridge/nic.cc @@ -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()) 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()) 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()) 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()) Dhcp_packet(size - sizeof(Ipv4_packet) - sizeof(Udp_packet)); /* check for DHCP ACKs containing new client ips */