traffic-selector: Print ICMP[v6] message type and code in a more readable way

This commit is contained in:
Tobias Brunner 2013-10-14 16:53:42 +02:00
parent 4bebe45abb
commit 000235f1c5
1 changed files with 35 additions and 4 deletions

View File

@ -193,6 +193,22 @@ static bool is_any(private_traffic_selector_t *this)
return this->from_port == 0 && this->to_port == 0xffff;
}
/**
* Print ICMP/ICMPv6 type and code
*/
static int print_icmp(printf_hook_data_t *data, u_int16_t port)
{
u_int8_t type, code;
type = traffic_selector_icmp_type(port);
code = traffic_selector_icmp_code(port);
if (code)
{
return print_in_hook(data, "%d(%d)", type, code);
}
return print_in_hook(data, "%d", type);
}
/**
* Described in header.
*/
@ -302,20 +318,35 @@ int traffic_selector_printf_hook(printf_hook_data_t *data,
{
struct servent *serv;
serv = getservbyport(htons(this->from_port), serv_proto);
if (serv)
if (this->protocol == IPPROTO_ICMP ||
this->protocol == IPPROTO_ICMPV6)
{
written += print_in_hook(data, "%s", serv->s_name);
written += print_icmp(data, this->from_port);
}
else
{
written += print_in_hook(data, "%d", this->from_port);
serv = getservbyport(htons(this->from_port), serv_proto);
if (serv)
{
written += print_in_hook(data, "%s", serv->s_name);
}
else
{
written += print_in_hook(data, "%d", this->from_port);
}
}
}
else if (is_opaque(this))
{
written += print_in_hook(data, "OPAQUE");
}
else if (this->protocol == IPPROTO_ICMP ||
this->protocol == IPPROTO_ICMPV6)
{
written += print_icmp(data, this->from_port);
written += print_in_hook(data, "-");
written += print_icmp(data, this->to_port);
}
else
{
written += print_in_hook(data, "%d-%d",