blob: e96304d8a4a7f70cae11754ac7532c58d61fb261 [file] [log] [blame]
Thomas Gleixner2874c5f2019-05-27 08:55:01 +02001// SPDX-License-Identifier: GPL-2.0-or-later
Linus Torvalds1da177e2005-04-16 15:20:36 -07002/*
3 * IPv6 input
YOSHIFUJI Hideaki1ab14572007-02-09 23:24:49 +09004 * Linux INET6 implementation
Linus Torvalds1da177e2005-04-16 15:20:36 -07005 *
6 * Authors:
7 * Pedro Roque <roque@di.fc.ul.pt>
8 * Ian P. Morris <I.P.Morris@soton.ac.uk>
9 *
Linus Torvalds1da177e2005-04-16 15:20:36 -070010 * Based in linux/net/ipv4/ip_input.c
Linus Torvalds1da177e2005-04-16 15:20:36 -070011 */
12/* Changes
13 *
Ian Morris67ba4152014-08-24 21:53:10 +010014 * Mitsuru KANDA @USAGI and
15 * YOSHIFUJI Hideaki @USAGI: Remove ipv6_parse_exthdrs().
Linus Torvalds1da177e2005-04-16 15:20:36 -070016 */
17
18#include <linux/errno.h>
19#include <linux/types.h>
20#include <linux/socket.h>
21#include <linux/sockios.h>
Linus Torvalds1da177e2005-04-16 15:20:36 -070022#include <linux/net.h>
23#include <linux/netdevice.h>
24#include <linux/in6.h>
25#include <linux/icmpv6.h>
YOSHIFUJI Hideaki7bc570c2008-04-03 09:22:53 +090026#include <linux/mroute6.h>
Tejun Heo5a0e3ad2010-03-24 17:04:11 +090027#include <linux/slab.h>
Paolo Abeni0e219ae2019-05-03 17:01:37 +020028#include <linux/indirect_call_wrapper.h>
Linus Torvalds1da177e2005-04-16 15:20:36 -070029
30#include <linux/netfilter.h>
31#include <linux/netfilter_ipv6.h>
32
33#include <net/sock.h>
34#include <net/snmp.h>
35
36#include <net/ipv6.h>
37#include <net/protocol.h>
38#include <net/transp_v6.h>
39#include <net/rawv6.h>
40#include <net/ndisc.h>
41#include <net/ip6_route.h>
42#include <net/addrconf.h>
43#include <net/xfrm.h>
Eric Dumazet1f07d032013-08-06 03:32:11 -070044#include <net/inet_ecn.h>
Wei-Chun Chao48fb6b52015-07-22 18:13:12 -070045#include <net/dst_metadata.h>
Linus Torvalds1da177e2005-04-16 15:20:36 -070046
Paolo Abeni97ff7ff2019-05-03 17:01:38 +020047INDIRECT_CALLABLE_DECLARE(void udp_v6_early_demux(struct sk_buff *));
48INDIRECT_CALLABLE_DECLARE(void tcp_v6_early_demux(struct sk_buff *));
Edward Creed8269e22018-07-05 15:49:42 +010049static void ip6_rcv_finish_core(struct net *net, struct sock *sk,
50 struct sk_buff *skb)
Linus Torvalds1da177e2005-04-16 15:20:36 -070051{
subashab@codeaurora.orgdddb64b2017-03-23 13:34:16 -060052 void (*edemux)(struct sk_buff *skb);
53
Nikolay Borisove21145a2016-02-15 12:11:30 +020054 if (net->ipv4.sysctl_ip_early_demux && !skb_dst(skb) && skb->sk == NULL) {
Eric Dumazetc7109982012-07-26 12:18:11 +000055 const struct inet6_protocol *ipprot;
56
Eric Dumazetc7109982012-07-26 12:18:11 +000057 ipprot = rcu_dereference(inet6_protos[ipv6_hdr(skb)->nexthdr]);
subashab@codeaurora.orgdddb64b2017-03-23 13:34:16 -060058 if (ipprot && (edemux = READ_ONCE(ipprot->early_demux)))
Paolo Abeni97ff7ff2019-05-03 17:01:38 +020059 INDIRECT_CALL_2(edemux, tcp_v6_early_demux,
60 udp_v6_early_demux, skb);
Eric Dumazetc7109982012-07-26 12:18:11 +000061 }
Wei-Chun Chao48fb6b52015-07-22 18:13:12 -070062 if (!skb_valid_dst(skb))
Linus Torvalds1da177e2005-04-16 15:20:36 -070063 ip6_route_input(skb);
Edward Creed8269e22018-07-05 15:49:42 +010064}
65
66int ip6_rcv_finish(struct net *net, struct sock *sk, struct sk_buff *skb)
67{
68 /* if ingress device is enslaved to an L3 master device pass the
69 * skb to its handler for processing
70 */
71 skb = l3mdev_ip6_rcv(skb);
72 if (!skb)
73 return NET_RX_SUCCESS;
74 ip6_rcv_finish_core(net, sk, skb);
Linus Torvalds1da177e2005-04-16 15:20:36 -070075
76 return dst_input(skb);
77}
78
Edward Creed8269e22018-07-05 15:49:42 +010079static void ip6_sublist_rcv_finish(struct list_head *head)
80{
81 struct sk_buff *skb, *next;
82
Xin Longc7a42eb2019-08-23 19:33:03 +080083 list_for_each_entry_safe(skb, next, head, list) {
84 skb_list_del_init(skb);
Edward Creed8269e22018-07-05 15:49:42 +010085 dst_input(skb);
Xin Longc7a42eb2019-08-23 19:33:03 +080086 }
Edward Creed8269e22018-07-05 15:49:42 +010087}
88
Paolo Abeni197dbf22019-11-20 13:47:35 +010089static bool ip6_can_use_hint(const struct sk_buff *skb,
90 const struct sk_buff *hint)
91{
92 return hint && !skb_dst(skb) &&
93 ipv6_addr_equal(&ipv6_hdr(hint)->daddr, &ipv6_hdr(skb)->daddr);
94}
95
96static struct sk_buff *ip6_extract_route_hint(const struct net *net,
97 struct sk_buff *skb)
98{
99 if (fib6_routes_require_src(net) || fib6_has_custom_rules(net))
100 return NULL;
101
102 return skb;
103}
104
Edward Creed8269e22018-07-05 15:49:42 +0100105static void ip6_list_rcv_finish(struct net *net, struct sock *sk,
106 struct list_head *head)
107{
Paolo Abeni197dbf22019-11-20 13:47:35 +0100108 struct sk_buff *skb, *next, *hint = NULL;
Edward Creed8269e22018-07-05 15:49:42 +0100109 struct dst_entry *curr_dst = NULL;
Edward Creed8269e22018-07-05 15:49:42 +0100110 struct list_head sublist;
111
112 INIT_LIST_HEAD(&sublist);
113 list_for_each_entry_safe(skb, next, head, list) {
114 struct dst_entry *dst;
115
Edward Cree22f6bbb2018-12-04 17:37:57 +0000116 skb_list_del_init(skb);
Edward Creed8269e22018-07-05 15:49:42 +0100117 /* if ingress device is enslaved to an L3 master device pass the
118 * skb to its handler for processing
119 */
120 skb = l3mdev_ip6_rcv(skb);
121 if (!skb)
122 continue;
Paolo Abeni197dbf22019-11-20 13:47:35 +0100123
124 if (ip6_can_use_hint(skb, hint))
125 skb_dst_copy(skb, hint);
126 else
127 ip6_rcv_finish_core(net, sk, skb);
Edward Creed8269e22018-07-05 15:49:42 +0100128 dst = skb_dst(skb);
129 if (curr_dst != dst) {
Paolo Abeni197dbf22019-11-20 13:47:35 +0100130 hint = ip6_extract_route_hint(net, skb);
131
Edward Creed8269e22018-07-05 15:49:42 +0100132 /* dispatch old sublist */
133 if (!list_empty(&sublist))
134 ip6_sublist_rcv_finish(&sublist);
135 /* start new sublist */
136 INIT_LIST_HEAD(&sublist);
137 curr_dst = dst;
138 }
139 list_add_tail(&skb->list, &sublist);
140 }
141 /* dispatch final sublist */
142 ip6_sublist_rcv_finish(&sublist);
143}
144
145static struct sk_buff *ip6_rcv_core(struct sk_buff *skb, struct net_device *dev,
146 struct net *net)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700147{
Eric Dumazetb71d1d42011-04-22 04:53:02 +0000148 const struct ipv6hdr *hdr;
Ian Morris67ba4152014-08-24 21:53:10 +0100149 u32 pkt_len;
YOSHIFUJI Hideakia11d2062006-11-04 20:11:37 +0900150 struct inet6_dev *idev;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700151
YOSHIFUJI Hideakia11d2062006-11-04 20:11:37 +0900152 if (skb->pkt_type == PACKET_OTHERHOST) {
153 kfree_skb(skb);
Edward Creed8269e22018-07-05 15:49:42 +0100154 return NULL;
YOSHIFUJI Hideakia11d2062006-11-04 20:11:37 +0900155 }
Linus Torvalds1da177e2005-04-16 15:20:36 -0700156
YOSHIFUJI Hideakia11d2062006-11-04 20:11:37 +0900157 rcu_read_lock();
158
159 idev = __in6_dev_get(skb->dev);
160
Eric Dumazetc2005eb2016-04-27 16:44:41 -0700161 __IP6_UPD_PO_STATS(net, idev, IPSTATS_MIB_IN, skb->len);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700162
YOSHIFUJI Hideaki778d80b2008-06-28 14:17:11 +0900163 if ((skb = skb_share_check(skb, GFP_ATOMIC)) == NULL ||
164 !idev || unlikely(idev->cnf.disable_ipv6)) {
Eric Dumazet1d015502016-04-27 16:44:40 -0700165 __IP6_INC_STATS(net, idev, IPSTATS_MIB_INDISCARDS);
Jesper Nilsson71f6f6d2009-03-27 00:17:45 -0700166 goto drop;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700167 }
168
Guillaume Chazarain6b7fdc32006-07-24 23:44:44 -0700169 memset(IP6CB(skb), 0, sizeof(struct inet6_skb_parm));
170
Linus Torvalds1da177e2005-04-16 15:20:36 -0700171 /*
172 * Store incoming device index. When the packet will
173 * be queued, we cannot refer to skb->dev anymore.
174 *
175 * BTW, when we send a packet for our own local address on a
176 * non-loopback interface (e.g. ethX), it is being delivered
Daniel Lezcanode3cb742007-09-25 19:16:28 -0700177 * via the loopback interface (lo) here; skb->dev = loopback_dev.
Linus Torvalds1da177e2005-04-16 15:20:36 -0700178 * It, however, should be considered as if it is being
179 * arrived via the sending interface (ethX), because of the
180 * nature of scoping architecture. --yoshfuji
181 */
Wei-Chun Chao48fb6b52015-07-22 18:13:12 -0700182 IP6CB(skb)->iif = skb_valid_dst(skb) ? ip6_dst_idev(skb_dst(skb))->dev->ifindex : dev->ifindex;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700183
Herbert Xu28891392006-06-30 13:35:46 -0700184 if (unlikely(!pskb_may_pull(skb, sizeof(*hdr))))
Linus Torvalds1da177e2005-04-16 15:20:36 -0700185 goto err;
186
Arnaldo Carvalho de Melo0660e032007-04-25 17:54:47 -0700187 hdr = ipv6_hdr(skb);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700188
189 if (hdr->version != 6)
190 goto err;
191
Eric Dumazet1d015502016-04-27 16:44:40 -0700192 __IP6_ADD_STATS(net, idev,
193 IPSTATS_MIB_NOECTPKTS +
Eric Dumazet1f07d032013-08-06 03:32:11 -0700194 (ipv6_get_dsfield(hdr) & INET_ECN_MASK),
Eric Dumazet1d015502016-04-27 16:44:40 -0700195 max_t(unsigned short, 1, skb_shinfo(skb)->gso_segs));
YOSHIFUJI Hideakif630e432008-06-19 16:33:57 -0700196 /*
197 * RFC4291 2.5.3
Florian Westphal0aa8c132017-04-14 20:22:43 +0200198 * The loopback address must not be used as the source address in IPv6
199 * packets that are sent outside of a single node. [..]
YOSHIFUJI Hideakif630e432008-06-19 16:33:57 -0700200 * A packet received on an interface with a destination address
201 * of loopback must be dropped.
202 */
Florian Westphal0aa8c132017-04-14 20:22:43 +0200203 if ((ipv6_addr_loopback(&hdr->saddr) ||
204 ipv6_addr_loopback(&hdr->daddr)) &&
Robert Shearman3ede0bb2018-09-19 13:56:53 +0100205 !(dev->flags & IFF_LOOPBACK) &&
206 !netif_is_l3_master(dev))
YOSHIFUJI Hideakif630e432008-06-19 16:33:57 -0700207 goto err;
208
Hannes Frederic Sowa1c4a1542013-03-26 08:13:34 +0000209 /* RFC4291 Errata ID: 3480
210 * Interface-Local scope spans only a single interface on a
211 * node and is useful only for loopback transmission of
212 * multicast. Packets with interface-local scope received
213 * from another node must be discarded.
214 */
215 if (!(skb->pkt_type == PACKET_LOOPBACK ||
216 dev->flags & IFF_LOOPBACK) &&
217 ipv6_addr_is_multicast(&hdr->daddr) &&
218 IPV6_ADDR_MC_SCOPE(&hdr->daddr) == 1)
219 goto err;
220
Johannes Bergabbc3042016-02-04 13:31:19 +0100221 /* If enabled, drop unicast packets that were encapsulated in link-layer
222 * multicast or broadcast to protected against the so-called "hole-196"
223 * attack in 802.11 wireless.
224 */
225 if (!ipv6_addr_is_multicast(&hdr->daddr) &&
226 (skb->pkt_type == PACKET_BROADCAST ||
227 skb->pkt_type == PACKET_MULTICAST) &&
228 idev->cnf.drop_unicast_in_l2_multicast)
229 goto err;
230
Hannes Frederic Sowa20314092013-02-10 05:35:22 +0000231 /* RFC4291 2.7
232 * Nodes must not originate a packet to a multicast address whose scope
233 * field contains the reserved value 0; if such a packet is received, it
234 * must be silently dropped.
235 */
236 if (ipv6_addr_is_multicast(&hdr->daddr) &&
237 IPV6_ADDR_MC_SCOPE(&hdr->daddr) == 0)
238 goto err;
239
Brian Haleyc4573382011-11-08 04:41:42 +0000240 /*
241 * RFC4291 2.7
242 * Multicast addresses must not be used as source addresses in IPv6
243 * packets or appear in any Routing header.
244 */
245 if (ipv6_addr_is_multicast(&hdr->saddr))
246 goto err;
247
Eric Dumazet6af17992019-10-02 09:38:55 -0700248 /* While RFC4291 is not explicit about v4mapped addresses
249 * in IPv6 headers, it seems clear linux dual-stack
250 * model can not deal properly with these.
251 * Security models could be fooled by ::ffff:127.0.0.1 for example.
252 *
253 * https://tools.ietf.org/html/draft-itojun-v6ops-v4mapped-harmful-02
254 */
255 if (ipv6_addr_v4mapped(&hdr->saddr))
256 goto err;
257
Arnaldo Carvalho de Melob0e380b2007-04-10 21:21:55 -0700258 skb->transport_header = skb->network_header + sizeof(*hdr);
Patrick McHardy951dbc82006-01-06 23:02:34 -0800259 IP6CB(skb)->nhoff = offsetof(struct ipv6hdr, nexthdr);
260
Linus Torvalds1da177e2005-04-16 15:20:36 -0700261 pkt_len = ntohs(hdr->payload_len);
262
263 /* pkt_len may be zero if Jumbo payload option is present */
264 if (pkt_len || hdr->nexthdr != NEXTHDR_HOP) {
Mitsuru Chinen60e5c162007-04-04 23:54:59 -0700265 if (pkt_len + sizeof(struct ipv6hdr) > skb->len) {
Eric Dumazet1d015502016-04-27 16:44:40 -0700266 __IP6_INC_STATS(net,
267 idev, IPSTATS_MIB_INTRUNCATEDPKTS);
Mitsuru Chinen60e5c162007-04-04 23:54:59 -0700268 goto drop;
269 }
Linus Torvalds1da177e2005-04-16 15:20:36 -0700270 if (pskb_trim_rcsum(skb, pkt_len + sizeof(struct ipv6hdr))) {
Eric Dumazet1d015502016-04-27 16:44:40 -0700271 __IP6_INC_STATS(net, idev, IPSTATS_MIB_INHDRERRORS);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700272 goto drop;
273 }
Arnaldo Carvalho de Melo0660e032007-04-25 17:54:47 -0700274 hdr = ipv6_hdr(skb);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700275 }
276
277 if (hdr->nexthdr == NEXTHDR_HOP) {
Herbert Xue5bbef22007-10-15 12:50:28 -0700278 if (ipv6_parse_hopopts(skb) < 0) {
Eric Dumazet1d015502016-04-27 16:44:40 -0700279 __IP6_INC_STATS(net, idev, IPSTATS_MIB_INHDRERRORS);
YOSHIFUJI Hideakia11d2062006-11-04 20:11:37 +0900280 rcu_read_unlock();
Edward Creed8269e22018-07-05 15:49:42 +0100281 return NULL;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700282 }
Linus Torvalds1da177e2005-04-16 15:20:36 -0700283 }
284
YOSHIFUJI Hideakia11d2062006-11-04 20:11:37 +0900285 rcu_read_unlock();
286
Herbert Xu71f9dac2009-06-26 19:22:37 -0700287 /* Must drop socket now because of tproxy. */
Joe Stringercf7fbe62020-03-29 15:53:38 -0700288 if (!skb_sk_is_prefetched(skb))
289 skb_orphan(skb);
Herbert Xu71f9dac2009-06-26 19:22:37 -0700290
Edward Creed8269e22018-07-05 15:49:42 +0100291 return skb;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700292err:
Eric Dumazet1d015502016-04-27 16:44:40 -0700293 __IP6_INC_STATS(net, idev, IPSTATS_MIB_INHDRERRORS);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700294drop:
YOSHIFUJI Hideakia11d2062006-11-04 20:11:37 +0900295 rcu_read_unlock();
Linus Torvalds1da177e2005-04-16 15:20:36 -0700296 kfree_skb(skb);
Edward Creed8269e22018-07-05 15:49:42 +0100297 return NULL;
298}
299
300int ipv6_rcv(struct sk_buff *skb, struct net_device *dev, struct packet_type *pt, struct net_device *orig_dev)
301{
302 struct net *net = dev_net(skb->dev);
303
304 skb = ip6_rcv_core(skb, dev, net);
305 if (skb == NULL)
306 return NET_RX_DROP;
307 return NF_HOOK(NFPROTO_IPV6, NF_INET_PRE_ROUTING,
308 net, NULL, skb, dev, NULL,
309 ip6_rcv_finish);
310}
311
312static void ip6_sublist_rcv(struct list_head *head, struct net_device *dev,
313 struct net *net)
314{
315 NF_HOOK_LIST(NFPROTO_IPV6, NF_INET_PRE_ROUTING, net, NULL,
316 head, dev, NULL, ip6_rcv_finish);
317 ip6_list_rcv_finish(net, NULL, head);
318}
319
320/* Receive a list of IPv6 packets */
321void ipv6_list_rcv(struct list_head *head, struct packet_type *pt,
322 struct net_device *orig_dev)
323{
324 struct net_device *curr_dev = NULL;
325 struct net *curr_net = NULL;
326 struct sk_buff *skb, *next;
327 struct list_head sublist;
328
329 INIT_LIST_HEAD(&sublist);
330 list_for_each_entry_safe(skb, next, head, list) {
331 struct net_device *dev = skb->dev;
332 struct net *net = dev_net(dev);
333
Edward Cree22f6bbb2018-12-04 17:37:57 +0000334 skb_list_del_init(skb);
Edward Creed8269e22018-07-05 15:49:42 +0100335 skb = ip6_rcv_core(skb, dev, net);
336 if (skb == NULL)
337 continue;
338
339 if (curr_dev != dev || curr_net != net) {
340 /* dispatch old sublist */
341 if (!list_empty(&sublist))
342 ip6_sublist_rcv(&sublist, curr_dev, curr_net);
343 /* start new sublist */
344 INIT_LIST_HEAD(&sublist);
345 curr_dev = dev;
346 curr_net = net;
347 }
348 list_add_tail(&skb->list, &sublist);
349 }
350 /* dispatch final sublist */
Florian Westphal51210ad2019-10-29 01:44:04 +0100351 if (!list_empty(&sublist))
352 ip6_sublist_rcv(&sublist, curr_dev, curr_net);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700353}
354
Paolo Abeni0e219ae2019-05-03 17:01:37 +0200355INDIRECT_CALLABLE_DECLARE(int udpv6_rcv(struct sk_buff *));
356INDIRECT_CALLABLE_DECLARE(int tcp_v6_rcv(struct sk_buff *));
357
Linus Torvalds1da177e2005-04-16 15:20:36 -0700358/*
359 * Deliver the packet to the host
360 */
Paolo Abeni80bde362018-11-07 12:38:32 +0100361void ip6_protocol_deliver_rcu(struct net *net, struct sk_buff *skb, int nexthdr,
362 bool have_final)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700363{
Alexey Dobriyan41135cc2009-09-14 12:22:28 +0000364 const struct inet6_protocol *ipprot;
David S. Millerf9242b62012-06-19 18:56:21 -0700365 struct inet6_dev *idev;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700366 unsigned int nhoff;
Eric Dumazeta50feda2012-05-18 18:57:34 +0000367 bool raw;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700368
Linus Torvalds1da177e2005-04-16 15:20:36 -0700369 /*
370 * Parse extension headers
371 */
372
David S. Miller1b0ccfe2015-06-10 15:29:31 -0700373resubmit:
Eric Dumazetadf30902009-06-02 05:19:30 +0000374 idev = ip6_dst_idev(skb_dst(skb));
Patrick McHardy951dbc82006-01-06 23:02:34 -0800375 nhoff = IP6CB(skb)->nhoff;
Paolo Abeni80bde362018-11-07 12:38:32 +0100376 if (!have_final) {
377 if (!pskb_pull(skb, skb_transport_offset(skb)))
378 goto discard;
379 nexthdr = skb_network_header(skb)[nhoff];
380 }
Linus Torvalds1da177e2005-04-16 15:20:36 -0700381
Tom Herbert4c642422016-05-18 09:06:11 -0700382resubmit_final:
Pavel Emelyanov69d6da02007-11-19 22:35:57 -0800383 raw = raw6_local_deliver(skb, nexthdr);
Ian Morrise5d08d72014-11-23 21:28:43 +0000384 ipprot = rcu_dereference(inet6_protos[nexthdr]);
Ian Morris53b24b82015-03-29 14:00:05 +0100385 if (ipprot) {
Linus Torvalds1da177e2005-04-16 15:20:36 -0700386 int ret;
YOSHIFUJI Hideaki1ab14572007-02-09 23:24:49 +0900387
Tom Herbert1da44f92016-05-18 09:06:12 -0700388 if (have_final) {
389 if (!(ipprot->flags & INET6_PROTO_FINAL)) {
390 /* Once we've seen a final protocol don't
391 * allow encapsulation on any non-final
392 * ones. This allows foo in UDP encapsulation
393 * to work.
394 */
395 goto discard;
396 }
397 } else if (ipprot->flags & INET6_PROTO_FINAL) {
Eric Dumazetb71d1d42011-04-22 04:53:02 +0000398 const struct ipv6hdr *hdr;
Mike Manning5226b6a2018-11-07 15:36:09 +0000399 int sdif = inet6_sdif(skb);
400 struct net_device *dev;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700401
Tom Herbert1da44f92016-05-18 09:06:12 -0700402 /* Only do this once for first final protocol */
403 have_final = true;
404
Yasuyuki Kozakai9fb9cbb2005-11-09 16:38:16 -0800405 /* Free reference early: we don't need it any more,
406 and it may hold ip_conntrack module loaded
407 indefinitely. */
Florian Westphal895b5c92019-09-29 20:54:03 +0200408 nf_reset_ct(skb);
Yasuyuki Kozakai9fb9cbb2005-11-09 16:38:16 -0800409
Arnaldo Carvalho de Melod56f90a2007-04-10 20:50:43 -0700410 skb_postpull_rcsum(skb, skb_network_header(skb),
Arnaldo Carvalho de Melocfe1fc72007-03-16 17:26:39 -0300411 skb_network_header_len(skb));
Arnaldo Carvalho de Melo0660e032007-04-25 17:54:47 -0700412 hdr = ipv6_hdr(skb);
Mike Manning5226b6a2018-11-07 15:36:09 +0000413
414 /* skb->dev passed may be master dev for vrfs. */
415 if (sdif) {
416 dev = dev_get_by_index_rcu(net, sdif);
417 if (!dev)
418 goto discard;
419 } else {
420 dev = skb->dev;
421 }
422
Linus Torvalds1da177e2005-04-16 15:20:36 -0700423 if (ipv6_addr_is_multicast(&hdr->daddr) &&
Mike Manning5226b6a2018-11-07 15:36:09 +0000424 !ipv6_chk_mcast_addr(dev, &hdr->daddr,
425 &hdr->saddr) &&
YOSHIFUJI Hideaki / 吉藤英明daad1512013-01-13 05:02:18 +0000426 !ipv6_is_mld(skb, nexthdr, skb_network_header_len(skb)))
Linus Torvalds1da177e2005-04-16 15:20:36 -0700427 goto discard;
428 }
429 if (!(ipprot->flags & INET6_PROTO_NOPOLICY) &&
YOSHIFUJI Hideaki1ab14572007-02-09 23:24:49 +0900430 !xfrm6_policy_check(NULL, XFRM_POLICY_IN, skb))
Linus Torvalds1da177e2005-04-16 15:20:36 -0700431 goto discard;
YOSHIFUJI Hideaki1ab14572007-02-09 23:24:49 +0900432
Paolo Abeni0e219ae2019-05-03 17:01:37 +0200433 ret = INDIRECT_CALL_2(ipprot->handler, tcp_v6_rcv, udpv6_rcv,
434 skb);
Tom Herbert4c642422016-05-18 09:06:11 -0700435 if (ret > 0) {
436 if (ipprot->flags & INET6_PROTO_FINAL) {
437 /* Not an extension header, most likely UDP
438 * encapsulation. Use return value as nexthdr
439 * protocol not nhoff (which presumably is
440 * not set by handler).
441 */
442 nexthdr = ret;
443 goto resubmit_final;
444 } else {
445 goto resubmit;
446 }
447 } else if (ret == 0) {
Eric Dumazet1d015502016-04-27 16:44:40 -0700448 __IP6_INC_STATS(net, idev, IPSTATS_MIB_INDELIVERS);
Tom Herbert4c642422016-05-18 09:06:11 -0700449 }
Linus Torvalds1da177e2005-04-16 15:20:36 -0700450 } else {
Pavel Emelyanov69d6da02007-11-19 22:35:57 -0800451 if (!raw) {
Linus Torvalds1da177e2005-04-16 15:20:36 -0700452 if (xfrm6_policy_check(NULL, XFRM_POLICY_IN, skb)) {
Eric Dumazet1d015502016-04-27 16:44:40 -0700453 __IP6_INC_STATS(net, idev,
454 IPSTATS_MIB_INUNKNOWNPROTOS);
Patrick McHardyfad87ac2005-08-16 21:03:41 -0700455 icmpv6_send(skb, ICMPV6_PARAMPROB,
Alexey Dobriyan3ffe5332010-02-18 08:25:24 +0000456 ICMPV6_UNK_NEXTHDR, nhoff);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700457 }
Neil Hormand8c6f4b2013-03-01 07:44:08 +0000458 kfree_skb(skb);
459 } else {
Eric Dumazet1d015502016-04-27 16:44:40 -0700460 __IP6_INC_STATS(net, idev, IPSTATS_MIB_INDELIVERS);
Neil Hormand8c6f4b2013-03-01 07:44:08 +0000461 consume_skb(skb);
462 }
Linus Torvalds1da177e2005-04-16 15:20:36 -0700463 }
Paolo Abeni80bde362018-11-07 12:38:32 +0100464 return;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700465
466discard:
Eric Dumazet1d015502016-04-27 16:44:40 -0700467 __IP6_INC_STATS(net, idev, IPSTATS_MIB_INDISCARDS);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700468 kfree_skb(skb);
Paolo Abeni80bde362018-11-07 12:38:32 +0100469}
470
471static int ip6_input_finish(struct net *net, struct sock *sk, struct sk_buff *skb)
472{
473 rcu_read_lock();
474 ip6_protocol_deliver_rcu(net, skb, 0, false);
475 rcu_read_unlock();
476
Linus Torvalds1da177e2005-04-16 15:20:36 -0700477 return 0;
478}
479
480
481int ip6_input(struct sk_buff *skb)
482{
Eric W. Biederman29a26a52015-09-15 20:04:16 -0500483 return NF_HOOK(NFPROTO_IPV6, NF_INET_LOCAL_IN,
484 dev_net(skb->dev), NULL, skb, skb->dev, NULL,
Patrick McHardy6e23ae22007-11-19 18:53:30 -0800485 ip6_input_finish);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700486}
David Ahernb4869aa2016-06-06 20:50:40 -0700487EXPORT_SYMBOL_GPL(ip6_input);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700488
489int ip6_mc_input(struct sk_buff *skb)
490{
Mike Manning5226b6a2018-11-07 15:36:09 +0000491 int sdif = inet6_sdif(skb);
Eric Dumazetb71d1d42011-04-22 04:53:02 +0000492 const struct ipv6hdr *hdr;
Mike Manning5226b6a2018-11-07 15:36:09 +0000493 struct net_device *dev;
Eric Dumazeta50feda2012-05-18 18:57:34 +0000494 bool deliver;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700495
Eric Dumazetc2005eb2016-04-27 16:44:41 -0700496 __IP6_UPD_PO_STATS(dev_net(skb_dst(skb)->dev),
Stephen Suryaputrabdb7cc62018-04-16 13:42:16 -0400497 __in6_dev_get_safely(skb->dev), IPSTATS_MIB_INMCAST,
Neil Hormanedf391f2009-04-27 02:45:02 -0700498 skb->len);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700499
Mike Manning5226b6a2018-11-07 15:36:09 +0000500 /* skb->dev passed may be master dev for vrfs. */
501 if (sdif) {
502 rcu_read_lock();
503 dev = dev_get_by_index_rcu(dev_net(skb->dev), sdif);
504 if (!dev) {
505 rcu_read_unlock();
506 kfree_skb(skb);
507 return -ENODEV;
508 }
509 } else {
510 dev = skb->dev;
511 }
512
Arnaldo Carvalho de Melo0660e032007-04-25 17:54:47 -0700513 hdr = ipv6_hdr(skb);
Mike Manning5226b6a2018-11-07 15:36:09 +0000514 deliver = ipv6_chk_mcast_addr(dev, &hdr->daddr, NULL);
515 if (sdif)
516 rcu_read_unlock();
Linus Torvalds1da177e2005-04-16 15:20:36 -0700517
YOSHIFUJI Hideaki7bc570c2008-04-03 09:22:53 +0900518#ifdef CONFIG_IPV6_MROUTE
Linus Torvalds1da177e2005-04-16 15:20:36 -0700519 /*
YOSHIFUJI Hideaki7bc570c2008-04-03 09:22:53 +0900520 * IPv6 multicast router mode is now supported ;)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700521 */
YOSHIFUJI Hideaki53b79972008-07-19 22:35:03 -0700522 if (dev_net(skb->dev)->ipv6.devconf_all->mc_forwarding &&
Hannes Frederic Sowaddf64352013-03-08 02:07:23 +0000523 !(ipv6_addr_type(&hdr->daddr) &
524 (IPV6_ADDR_LOOPBACK|IPV6_ADDR_LINKLOCAL)) &&
YOSHIFUJI Hideaki7bc570c2008-04-03 09:22:53 +0900525 likely(!(IP6CB(skb)->flags & IP6SKB_FORWARDED))) {
526 /*
527 * Okay, we try to forward - split and duplicate
528 * packets.
529 */
530 struct sk_buff *skb2;
531 struct inet6_skb_parm *opt = IP6CB(skb);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700532
YOSHIFUJI Hideaki7bc570c2008-04-03 09:22:53 +0900533 /* Check for MLD */
YOSHIFUJI Hideaki / 吉藤英明dd3332b2013-01-13 05:02:45 +0000534 if (unlikely(opt->flags & IP6SKB_ROUTERALERT)) {
YOSHIFUJI Hideaki7bc570c2008-04-03 09:22:53 +0900535 /* Check if this is a mld message */
YOSHIFUJI Hideaki7bc570c2008-04-03 09:22:53 +0900536 u8 nexthdr = hdr->nexthdr;
Jesse Gross75f28112011-11-30 17:05:51 -0800537 __be16 frag_off;
YOSHIFUJI Hideaki7bc570c2008-04-03 09:22:53 +0900538 int offset;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700539
YOSHIFUJI Hideaki7bc570c2008-04-03 09:22:53 +0900540 /* Check if the value of Router Alert
541 * is for MLD (0x0000).
542 */
YOSHIFUJI Hideaki / 吉藤英明dd3332b2013-01-13 05:02:45 +0000543 if (opt->ra == htons(IPV6_OPT_ROUTERALERT_MLD)) {
Eric Dumazeta50feda2012-05-18 18:57:34 +0000544 deliver = false;
YOSHIFUJI Hideakiaba60962008-04-10 15:41:26 +0900545
YOSHIFUJI Hideaki7bc570c2008-04-03 09:22:53 +0900546 if (!ipv6_ext_hdr(nexthdr)) {
547 /* BUG */
YOSHIFUJI Hideakiaba60962008-04-10 15:41:26 +0900548 goto out;
YOSHIFUJI Hideaki7bc570c2008-04-03 09:22:53 +0900549 }
550 offset = ipv6_skip_exthdr(skb, sizeof(*hdr),
Jesse Gross75f28112011-11-30 17:05:51 -0800551 &nexthdr, &frag_off);
YOSHIFUJI Hideaki7bc570c2008-04-03 09:22:53 +0900552 if (offset < 0)
YOSHIFUJI Hideakiaba60962008-04-10 15:41:26 +0900553 goto out;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700554
Angga4c938d22015-07-03 14:40:52 +1200555 if (ipv6_is_mld(skb, nexthdr, offset))
556 deliver = true;
YOSHIFUJI Hideaki1ab14572007-02-09 23:24:49 +0900557
Angga4c938d22015-07-03 14:40:52 +1200558 goto out;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700559 }
YOSHIFUJI Hideaki7bc570c2008-04-03 09:22:53 +0900560 /* unknown RA - process it normally */
561 }
562
563 if (deliver)
564 skb2 = skb_clone(skb, GFP_ATOMIC);
565 else {
566 skb2 = skb;
567 skb = NULL;
568 }
569
570 if (skb2) {
YOSHIFUJI Hideaki7bc570c2008-04-03 09:22:53 +0900571 ip6_mr_input(skb2);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700572 }
573 }
YOSHIFUJI Hideaki7bc570c2008-04-03 09:22:53 +0900574out:
YOSHIFUJI Hideakiaba60962008-04-10 15:41:26 +0900575#endif
576 if (likely(deliver))
Linus Torvalds1da177e2005-04-16 15:20:36 -0700577 ip6_input(skb);
YOSHIFUJI Hideakiaba60962008-04-10 15:41:26 +0900578 else {
579 /* discard */
580 kfree_skb(skb);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700581 }
Linus Torvalds1da177e2005-04-16 15:20:36 -0700582
583 return 0;
584}