forked from Minki/linux
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:
parent
a8787645e1
commit
61e76b178d
@ -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
|
||||||
|
@ -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;
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user