[ipxe-devel] [PATCH 01/10] icmpv6: Decode error codes
Hannes Reinecke
hare at suse.de
Thu Apr 30 13:18:41 UTC 2015
ICMPv6 might be sending some error codes, which we should decode
into the correct error numbers.
Signed-off-by: Hannes Reinecke <hare at suse.de>
---
src/net/icmpv6.c | 106 +++++++++++++++++++++++++++++++++++++++++++++++++++++--
1 file changed, 104 insertions(+), 2 deletions(-)
diff --git a/src/net/icmpv6.c b/src/net/icmpv6.c
index 45a3444..41fbe1a 100644
--- a/src/net/icmpv6.c
+++ b/src/net/icmpv6.c
@@ -40,6 +40,93 @@ FILE_LICENCE ( GPL2_OR_LATER_OR_UBDL );
struct icmp_echo_protocol icmpv6_echo_protocol __icmp_echo_protocol;
+#define EHOSTUNREACH_NO_ROUTE \
+ __einfo_error ( EINFO_EHOSTUNREACH_NO_ROUTE )
+#define EINFO_EHOSTUNREACH_NO_ROUTE \
+ __einfo_uniqify ( EINFO_EHOSTUNREACH, 0x01, \
+ "no route to destination" )
+#define EHOSTUNREACH_COMM_INHIBITED \
+ __einfo_error ( EINFO_EHOSTUNREACH_COMM_INHIBITED )
+#define EINFO_EHOSTUNREACH_COMM_INHIBITED \
+ __einfo_uniqify ( EINFO_EHOSTUNREACH, 0x02, \
+ "communication inhibited" )
+#define EHOSTUNREACH_OUT_OF_SCOPE \
+ __einfo_error ( EINFO_EHOSTUNREACH_OUT_OF_SCOPE )
+#define EINFO_EHOSTUNREACH_OUT_OF_SCOPE \
+ __einfo_uniqify ( EINFO_EHOSTUNREACH, 0x03, \
+ "out of source address scope" )
+#define EHOSTUNREACH_ADDR_UNREACH \
+ __einfo_error ( EINFO_EHOSTUNREACH_ADDR_UNREACH )
+#define EINFO_EHOSTUNREACH_ADDR_UNREACH \
+ __einfo_uniqify ( EINFO_EHOSTUNREACH, 0x04, \
+ "address unreachable" )
+#define EHOSTUNREACH_PORT_UNREACH \
+ __einfo_error ( EINFO_EHOSTUNREACH_PORT_UNREACH )
+#define EINFO_EHOSTUNREACH_PORT_UNREACH \
+ __einfo_uniqify ( EINFO_EHOSTUNREACH, 0x05, \
+ "port unreachable" )
+#define EHOSTUNREACH_ADDR_POLICY \
+ __einfo_error ( EINFO_EHOSTUNREACH_ADDR_POLICY )
+#define EINFO_EHOSTUNREACH_ADDR_POLICY \
+ __einfo_uniqify ( EINFO_EHOSTUNREACH, 0x06, \
+ "source address failed policy" )
+#define EHOSTUNREACH_ROUTE_RJT \
+ __einfo_error ( EINFO_EHOSTUNREACH_ROUTE_RJT )
+#define EINFO_EHOSTUNREACH_ROUTE_RJT \
+ __einfo_uniqify ( EINFO_EHOSTUNREACH, 0x07, \
+ "route rejected" )
+
+#define EUNREACH_STATUS( code ) \
+ EUNIQ ( EINFO_EHOSTUNREACH, ( code ), \
+ EHOSTUNREACH_NO_ROUTE, EHOSTUNREACH_COMM_INHIBITED, \
+ EHOSTUNREACH_OUT_OF_SCOPE, EHOSTUNREACH_ADDR_UNREACH, \
+ EHOSTUNREACH_PORT_UNREACH, EHOSTUNREACH_ADDR_POLICY, \
+ EHOSTUNREACH_ROUTE_RJT )
+
+#define EPROTO_PACKET \
+ __einfo_error ( EINFO_EPROTO_PACKET )
+#define EINFO_EPROTO_PACKET \
+ __einfo_uniqify ( EINFO_EPROTO, 0x01, \
+ "packet too big" )
+
+#define EPROTO_STATUS( code ) \
+ EUNIQ ( EINFO_EPROTO, ( code ), EPROTO_PACKET )
+
+#define ETIME_HOP_EXCEEDED \
+ __einfo_error ( EINFO_ETIME_HOP_EXCEEDED )
+#define EINFO_ETIME_HOP_EXCEEDED \
+ __einfo_uniqify ( EINFO_ETIME, 0x01, \
+ "hop limit exceeded" )
+#define ETIME_REASSEMBLY_EXCEEDED \
+ __einfo_error ( EINFO_ETIME_REASSEMBLY_EXCEEDED )
+#define EINFO_ETIME_REASSEMBLY_EXCEEDED \
+ __einfo_uniqify ( EINFO_ETIME, 0x02, \
+ "reassembly time exceeded" )
+
+#define ETIME_STATUS( code ) \
+ EUNIQ ( EINFO_ETIME, ( code ), \
+ ETIME_HOP_EXCEEDED, ETIME_REASSEMBLY_EXCEEDED )
+
+#define EINVAL_HEADER \
+ __einfo_error ( EINFO_EINVAL_HEADER )
+#define EINFO_EINVAL_HEADER \
+ __einfo_uniqify( EINFO_EINVAL, 0x01, \
+ "invalid header field" )
+#define EINVAL_NEXT_TYPE \
+ __einfo_error ( EINFO_EINVAL_NEXT_TYPE )
+#define EINFO_EINVAL_NEXT_TYPE \
+ __einfo_uniqify( EINFO_EINVAL, 0x02, \
+ "next header type" )
+#define EINVAL_IPV6_OPTION \
+ __einfo_error ( EINFO_EINVAL_IPV6_OPTION )
+#define EINFO_EINVAL_IPV6_OPTION \
+ __einfo_uniqify( EINFO_EINVAL, 0x03, \
+ "invalid IPv6 option" )
+
+#define EINVAL_STATUS( code ) \
+ EUNIQ ( EINFO_EINVAL, ( code ), \
+ EINVAL_HEADER, EINVAL_NEXT_TYPE, EINVAL_IPV6_OPTION )
+
/**
* Process received ICMPv6 echo request packet
*
@@ -148,8 +235,23 @@ 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:
+ rc = EUNREACH_STATUS ( icmp->code );
+ break;
+ case 2:
+ rc = EPROTO_STATUS( icmp->code );
+ break;
+ case 3:
+ rc = ETIME_STATUS ( icmp->code );
+ break;
+ case 4:
+ rc = EINVAL_STATUS ( icmp->code );
+ break;
+ default:
+ rc = -ENOTSUP;
+ }
+ DBGC ( netdev, "ICMPv6 error message: %s\n", strerror(rc) );
goto done;
}
--
1.8.4.5
More information about the ipxe-devel
mailing list