freebsd-skq/sys/netinet6
ae a312c1bedf Fix deadlock in IPv6 PCB code.
When several threads are trying to send datagram to the same destination,
but fragmentation is disabled and datagram size exceeds link MTU,
ip6_output() calls pfctlinput2(PRC_MSGSIZE). It does notify all
sockets wanted to know MTU to this destination. And since all threads
hold PCB lock while sending, taking the lock for each PCB in the
in6_pcbnotify() leads to deadlock.

RFC 3542 p.11.3 suggests notify all application wanted to receive
IPV6_PATHMTU ancillary data for each ICMPv6 packet too big message.
But it doesn't require this, when we don't receive ICMPv6 message.

Change ip6_notify_pmtu() function to be able use it directly from
ip6_output() to notify only one socket, and to notify all sockets
when ICMPv6 packet too big message received.

PR:		197059
Differential Revision:	https://reviews.freebsd.org/D1949
Reviewed by:	no objection from #network
Obtained from:	Yandex LLC
MFC after:	1 week
Sponsored by:	Yandex LLC
2015-03-04 11:20:01 +00:00
..
dest6.c The r48589 promised to remove implicit inclusion of if_var.h soon. Prepare 2013-10-26 17:58:36 +00:00
frag6.c Move ip6_deletefraghdr() to frag6.c. 2015-02-16 05:58:32 +00:00
icmp6.c Remove unneded check. No need to do m_pullup to the size that we prepended. 2014-12-02 05:41:03 +00:00
icmp6.h
in6_cksum.c Fix the checksum computation for UDPLite/IPv6. This requires the 2014-10-02 10:32:24 +00:00
in6_gif.c Extern declarations in C files loses compile-time checking that 2014-12-25 21:32:37 +00:00
in6_ifattach.c Consistently use if_link. 2014-11-10 15:56:30 +00:00
in6_ifattach.h Use FF02:0:0:0:0:2:FF00::/104 prefix for IPv6 Node Information Group 2013-05-04 19:16:26 +00:00
in6_mcast.c Use new struct mbufq instead of struct ifqueue to manage packet queues in 2015-02-19 01:21:23 +00:00
in6_pcb.c Fix deadlock in IPv6 PCB code. 2015-03-04 11:20:01 +00:00
in6_pcb.h Make in6_pcblookup_hash_locked and in6_pcbladdr static. 2014-09-10 13:17:35 +00:00
in6_pcbgroup.c Refactor / restructure the RSS code into generic, IPv4 and IPv6 specific 2015-01-18 18:06:40 +00:00
in6_proto.c Renove faith(4) and faithd(8) from base. It looks like industry 2014-11-09 21:33:01 +00:00
in6_rmx.c Kill custom in_matroute() radix mathing function removing one rte mutex lock. 2014-11-11 02:52:40 +00:00
in6_rss.c Refactor / restructure the RSS code into generic, IPv4 and IPv6 specific 2015-01-18 18:06:40 +00:00
in6_rss.h Refactor / restructure the RSS code into generic, IPv4 and IPv6 specific 2015-01-18 18:06:40 +00:00
in6_src.c For now handle only multicast addresses, we still use routes to 2014-11-10 10:59:08 +00:00
in6_var.h Now that all users of _WANT_IFADDR are fixed, remove this crutch and 2015-02-19 23:16:10 +00:00
in6.c This fixes a bug in the way that the LLE timers for nd6 2015-02-09 19:28:11 +00:00
in6.h Kill custom in_matroute() radix mathing function removing one rte mutex lock. 2014-11-11 02:52:40 +00:00
ip6_ecn.h
ip6_forward.c Use ipsec6_in_reject() to simplify ip6_ipsec_fwd() and ip6_ipsec_input(). 2014-12-11 19:09:57 +00:00
ip6_gre.c Extern declarations in C files loses compile-time checking that 2014-12-25 21:32:37 +00:00
ip6_id.c Provide includes that are needed in these files, and before were read 2013-10-26 18:18:50 +00:00
ip6_input.c Fix deadlock in IPv6 PCB code. 2015-03-04 11:20:01 +00:00
ip6_ipsec.c Use ipsec6_in_reject() to simplify ip6_ipsec_fwd() and ip6_ipsec_input(). 2014-12-11 19:09:57 +00:00
ip6_ipsec.h Remove flag/flags argument from the following functions: 2014-12-11 18:35:34 +00:00
ip6_mroute.c When deciding whether to call m_pullup() even though there is adequate 2014-10-12 15:49:52 +00:00
ip6_mroute.h revert part of r260485 which changes how part of the header gets 2014-01-09 22:41:18 +00:00
ip6_output.c Fix deadlock in IPv6 PCB code. 2015-03-04 11:20:01 +00:00
ip6_var.h Fix deadlock in IPv6 PCB code. 2015-03-04 11:20:01 +00:00
ip6.h
ip6protosw.h Merge 'struct ip6protosw' and 'struct protosw' into one. Now we have 2014-08-08 01:57:15 +00:00
mld6_var.h - Rename 'struct mld_ifinfo' into 'struct mld_ifsoftc', since it really 2015-02-19 22:37:01 +00:00
mld6.c - Rename 'struct mld_ifinfo' into 'struct mld_ifsoftc', since it really 2015-02-19 22:37:01 +00:00
mld6.h
nd6_nbr.c Create nd6_ns_output_fib() function with extra argument fibnum. Use it 2015-03-03 10:50:03 +00:00
nd6_rtr.c Use in6_localip() instead of hand-rolled cycle. 2014-01-18 20:54:55 +00:00
nd6.c Implement Enhanced DAD algorithm for IPv6 described in 2015-03-02 17:30:26 +00:00
nd6.h Implement Enhanced DAD algorithm for IPv6 described in 2015-03-02 17:30:26 +00:00
pim6_var.h Remove more constants related to static sysctl nodes. The MAXID constants 2014-02-25 18:44:33 +00:00
pim6.h
raw_ip6.c Do not count security policy violation twice. 2014-12-11 19:20:13 +00:00
raw_ip6.h Migrate structs ip6stat, icmp6stat and rip6stat to PCPU counters. 2013-07-09 09:54:54 +00:00
route6.c The r48589 promised to remove implicit inclusion of if_var.h soon. Prepare 2013-10-26 17:58:36 +00:00
scope6_var.h Add sa6_checkzone_ifp() function. It checks correctness of struct 2014-11-10 16:12:51 +00:00
scope6.c Add sa6_checkzone_ifp() function. It checks correctness of struct 2014-11-10 16:12:51 +00:00
sctp6_usrreq.c Minimize the usage of SCTP_BUF_IS_EXTENDED. 2015-01-10 20:49:57 +00:00
sctp6_var.h
send.c Free mbuf in case of error. 2013-12-17 10:53:17 +00:00
send.h
tcp6_var.h
udp6_usrreq.c Refactor / restructure the RSS code into generic, IPv4 and IPv6 specific 2015-01-18 18:06:40 +00:00
udp6_var.h Add support for UDP-Lite protocol (RFC 3828) to IPv4 and IPv6 stacks. 2014-04-07 01:53:03 +00:00