On 01/04/15 08:26, Hannes Reinecke wrote:
diff --git a/src/net/icmpv6.c b/src/net/icmpv6.c index 45a3444..99e61ee 100644 --- a/src/net/icmpv6.c +++ b/src/net/icmpv6.c @@ -148,8 +148,28 @@ static int icmpv6_rx ( struct io_buffer *iobuf, struct net_device *netdev, /* Identify handler */ handler = icmpv6_handler ( icmp->type ); if ( ! handler ) { - DBGC ( netdev, "ICMPv6 unrecognised type %d\n", icmp->type ); - rc = -ENOTSUP; + switch (icmp->type) { + case 1: + DBGC ( netdev, "ICMPv6 destination unreachable\n" ); + rc = -ENETUNREACH; + break; + case 2: + DBGC ( netdev, "ICMPv6 packet too big\n" ); + rc = -EOVERFLOW; + break; + case 3: + DBGC ( netdev, "ICMPv6 timer exceeded\n" ); + rc = -ETIME; + break; + case 4: + DBGC ( netdev, "ICMPv6 parameter problem\n" ); + rc = -EINVAL; + break; + default: + DBGC ( netdev, "ICMPv6 unrecognised type %d\n", + icmp->type ); + rc = -ENOTSUP; + } goto done; }
This would be a perfect candidate for using EUNIQ() (which would avoid the need for the switch() and allow for reporting any number of ICMP error types without further increasing the code size). See e.g. the use of EPROTO_STATUS() in crypto/ocsp.c for a reference implementation.
Thanks, Michael _______________________________________________ ipxe-devel mailing list ipxe-devel@lists.ipxe.org https://lists.ipxe.org/mailman/listinfo.cgi/ipxe-devel