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:
Родитель
a8787645e1
Коммит
61e76b178d
|
@ -115,6 +115,8 @@ struct icmp6hdr {
|
|||
#define ICMPV6_NOT_NEIGHBOUR 2
|
||||
#define ICMPV6_ADDR_UNREACH 3
|
||||
#define ICMPV6_PORT_UNREACH 4
|
||||
#define ICMPV6_POLICY_FAIL 5
|
||||
#define ICMPV6_REJECT_ROUTE 6
|
||||
|
||||
/*
|
||||
* Codes for Time Exceeded
|
||||
|
|
|
@ -940,6 +940,14 @@ static const struct icmp6_err {
|
|||
.err = ECONNREFUSED,
|
||||
.fatal = 1,
|
||||
},
|
||||
{ /* POLICY_FAIL */
|
||||
.err = EACCES,
|
||||
.fatal = 1,
|
||||
},
|
||||
{ /* REJECT_ROUTE */
|
||||
.err = EACCES,
|
||||
.fatal = 1,
|
||||
},
|
||||
};
|
||||
|
||||
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) {
|
||||
case ICMPV6_DEST_UNREACH:
|
||||
fatal = 1;
|
||||
if (code <= ICMPV6_PORT_UNREACH) {
|
||||
if (code < ARRAY_SIZE(tab_unreach)) {
|
||||
*err = tab_unreach[code].err;
|
||||
fatal = tab_unreach[code].fatal;
|
||||
}
|
||||
|
|
Загрузка…
Ссылка в новой задаче