/* * \brief Dump header info of network packets * \author Martin Stein * \date 2016-08-15 */ /* * Copyright (C) 2016 Genode Labs GmbH * * This file is part of the Genode OS framework, which is distributed * under the terms of the GNU General Public License version 2. */ #ifndef _NET__DUMP_H_ #define _NET__DUMP_H_ /* Genode includes */ #include #include #include #include #include #include #include namespace Net { void dump_tcp(void * const base, Genode::size_t const size) { Tcp_packet * tcp = new (base) Tcp_packet(size); Genode::printf( "\033[32mTCP\033[0m %u > %u flags '", tcp->src_port(), tcp->dst_port()); if (tcp->fin()) { Genode::printf("f"); } if (tcp->syn()) { Genode::printf("s"); } if (tcp->rst()) { Genode::printf("r"); } if (tcp->psh()) { Genode::printf("p"); } if (tcp->ack()) { Genode::printf("a"); } if (tcp->urg()) { Genode::printf("u"); } Genode::printf("' "); } void dump_dhcp(void * const base, Genode::size_t const size) { Dhcp_packet * dhcp = new (base) Dhcp_packet(size); Genode::printf( "\033[32mDHCP\033[0m %x:%x:%x:%x:%x:%x > %u.%u.%u.%u cmd %u ", dhcp->client_mac().addr[0], dhcp->client_mac().addr[1], dhcp->client_mac().addr[2], dhcp->client_mac().addr[3], dhcp->client_mac().addr[4], dhcp->client_mac().addr[5], dhcp->siaddr().addr[0], dhcp->siaddr().addr[1], dhcp->siaddr().addr[2], dhcp->siaddr().addr[3], dhcp->op()); } void dump_udp(void * const base, Genode::size_t const size) { Udp_packet * udp = new (base) Udp_packet(size); Genode::printf( "\033[32mUDP\033[0m %u > %u ", udp->src_port(), udp->dst_port()); Genode::size_t data_size = size - sizeof(Udp_packet); void * data = udp->data(); if (Dhcp_packet::is_dhcp(udp)) { dump_dhcp(data, data_size); } } void dump_ipv4(void * const base, Genode::size_t const size) { Ipv4_packet * ipv4 = new (base) Ipv4_packet(size); Genode::printf( "\033[32mIPV4\033[0m %u.%u.%u.%u > %u.%u.%u.%u ", ipv4->src().addr[0], ipv4->src().addr[1], ipv4->src().addr[2], ipv4->src().addr[3], ipv4->dst().addr[0], ipv4->dst().addr[1], ipv4->dst().addr[2], ipv4->dst().addr[3]); void * data = ipv4->data(); Genode::size_t data_size = size - sizeof(Ipv4_packet); switch (ipv4->protocol()) { case Tcp_packet::IP_ID: dump_tcp(data, data_size); break; case Udp_packet::IP_ID: dump_udp(data, data_size); break; default: ; } } void dump_arp(void * const base, Genode::size_t const size) { Arp_packet * arp = new (base) Arp_packet(size); if (!arp->ethernet_ipv4()) { return; } Genode::printf( "\033[32mARP\033[0m %x:%x:%x:%x:%x:%x %u.%u.%u.%u " "> %x:%x:%x:%x:%x:%x %u.%u.%u.%u cmd %u ", arp->src_mac().addr[0], arp->src_mac().addr[1], arp->src_mac().addr[2], arp->src_mac().addr[3], arp->src_mac().addr[4], arp->src_mac().addr[5], arp->src_ip().addr[0], arp->src_ip().addr[1], arp->src_ip().addr[2], arp->src_ip().addr[3], arp->dst_mac().addr[0], arp->dst_mac().addr[1], arp->dst_mac().addr[2], arp->dst_mac().addr[3], arp->dst_mac().addr[4], arp->dst_mac().addr[5], arp->dst_ip().addr[0], arp->dst_ip().addr[1], arp->dst_ip().addr[2], arp->dst_ip().addr[3], arp->opcode()); } void dump_eth(void * const base, Genode::size_t const size) { Ethernet_frame * eth = new (base) Ethernet_frame(size); Genode::printf( "\033[32mETH\033[0m %x:%x:%x:%x:%x:%x > %x:%x:%x:%x:%x:%x ", eth->src().addr[0], eth->src().addr[1], eth->src().addr[2], eth->src().addr[3], eth->src().addr[4], eth->src().addr[5], eth->dst().addr[0], eth->dst().addr[1], eth->dst().addr[2], eth->dst().addr[3], eth->dst().addr[4], eth->dst().addr[5]); void * data = eth->data(); Genode::size_t data_size = size - sizeof(Ethernet_frame); switch (eth->type()) { case Ethernet_frame::ARP: dump_arp(data, data_size); break; case Ethernet_frame::IPV4: dump_ipv4(data, data_size); break; default: ; } } } #endif /* _NET__DUMP_H_ */