ICMPv6: treat dest unreachable codes 5 and 6 as EACCES, not EPROTO

RFC 4443 has defined two additional codes for ICMPv6 type 1 (destination
unreachable) messages:
        5 - Source address failed ingress/egress policy
	6 - Reject route to destination

Now they are treated as protocol error and icmpv6_err_convert() converts them
to EPROTO.

RFC 4443 says:
	"Codes 5 and 6 are more informative subsets of code 1."

Treat codes 5 and 6 as code 1 (EACCES)

Btw, connect() returning -EPROTO confuses firefox, so that fallback to
other/IPv4 addresses does not work:
https://bugzilla.mozilla.org/show_bug.cgi?id=910773

Signed-off-by: Jiri Bohac <jbohac@suse.cz>
Acked-by: Hannes Frederic Sowa <hannes@stressinduktion.org>
Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
Jiri Bohac 2013-08-30 11:18:45 +02:00 committed by David S. Miller
parent a8787645e1
commit 61e76b178d
2 changed files with 11 additions and 1 deletions

View File

@ -115,6 +115,8 @@ struct icmp6hdr {
#define ICMPV6_NOT_NEIGHBOUR 2 #define ICMPV6_NOT_NEIGHBOUR 2
#define ICMPV6_ADDR_UNREACH 3 #define ICMPV6_ADDR_UNREACH 3
#define ICMPV6_PORT_UNREACH 4 #define ICMPV6_PORT_UNREACH 4
#define ICMPV6_POLICY_FAIL 5
#define ICMPV6_REJECT_ROUTE 6
/* /*
* Codes for Time Exceeded * Codes for Time Exceeded

View File

@ -940,6 +940,14 @@ static const struct icmp6_err {
.err = ECONNREFUSED, .err = ECONNREFUSED,
.fatal = 1, .fatal = 1,
}, },
{ /* POLICY_FAIL */
.err = EACCES,
.fatal = 1,
},
{ /* REJECT_ROUTE */
.err = EACCES,
.fatal = 1,
},
}; };
int icmpv6_err_convert(u8 type, u8 code, int *err) int icmpv6_err_convert(u8 type, u8 code, int *err)
@ -951,7 +959,7 @@ int icmpv6_err_convert(u8 type, u8 code, int *err)
switch (type) { switch (type) {
case ICMPV6_DEST_UNREACH: case ICMPV6_DEST_UNREACH:
fatal = 1; fatal = 1;
if (code <= ICMPV6_PORT_UNREACH) { if (code < ARRAY_SIZE(tab_unreach)) {
*err = tab_unreach[code].err; *err = tab_unreach[code].err;
fatal = tab_unreach[code].fatal; fatal = tab_unreach[code].fatal;
} }