mirror of
https://github.com/genodelabs/genode.git
synced 2025-04-16 15:29:57 +00:00
net: transform packet data accessor into template
Supports stronger typing of raw accesses and const correctness. Issue #1915
This commit is contained in:
parent
3df03fbc41
commit
abed38e8ac
@ -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); }
|
||||
|
||||
|
||||
/***********************************
|
||||
|
@ -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); }
|
||||
|
||||
|
||||
/***************
|
||||
|
@ -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); }
|
||||
|
||||
|
||||
/***************
|
||||
|
@ -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;
|
||||
}
|
||||
|
@ -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);
|
||||
|
@ -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 */
|
||||
|
Loading…
x
Reference in New Issue
Block a user