Lines Matching full:skb

49 				struct sk_buff *skb)  in ip6_rcv_finish_core()  argument
52 !skb_dst(skb) && !skb->sk) { in ip6_rcv_finish_core()
53 switch (ipv6_hdr(skb)->nexthdr) { in ip6_rcv_finish_core()
56 tcp_v6_early_demux(skb); in ip6_rcv_finish_core()
60 udp_v6_early_demux(skb); in ip6_rcv_finish_core()
65 if (!skb_valid_dst(skb)) in ip6_rcv_finish_core()
66 ip6_route_input(skb); in ip6_rcv_finish_core()
69 int ip6_rcv_finish(struct net *net, struct sock *sk, struct sk_buff *skb) in ip6_rcv_finish() argument
72 * skb to its handler for processing in ip6_rcv_finish()
74 skb = l3mdev_ip6_rcv(skb); in ip6_rcv_finish()
75 if (!skb) in ip6_rcv_finish()
77 ip6_rcv_finish_core(net, sk, skb); in ip6_rcv_finish()
79 return dst_input(skb); in ip6_rcv_finish()
84 struct sk_buff *skb, *next; in ip6_sublist_rcv_finish() local
86 list_for_each_entry_safe(skb, next, head, list) { in ip6_sublist_rcv_finish()
87 skb_list_del_init(skb); in ip6_sublist_rcv_finish()
88 dst_input(skb); in ip6_sublist_rcv_finish()
92 static bool ip6_can_use_hint(const struct sk_buff *skb, in ip6_can_use_hint() argument
95 return hint && !skb_dst(skb) && in ip6_can_use_hint()
96 ipv6_addr_equal(&ipv6_hdr(hint)->daddr, &ipv6_hdr(skb)->daddr); in ip6_can_use_hint()
100 struct sk_buff *skb) in ip6_extract_route_hint() argument
103 IP6CB(skb)->flags & IP6SKB_MULTIPATH) in ip6_extract_route_hint()
106 return skb; in ip6_extract_route_hint()
112 struct sk_buff *skb, *next, *hint = NULL; in ip6_list_rcv_finish() local
116 list_for_each_entry_safe(skb, next, head, list) { in ip6_list_rcv_finish()
119 skb_list_del_init(skb); in ip6_list_rcv_finish()
121 * skb to its handler for processing in ip6_list_rcv_finish()
123 skb = l3mdev_ip6_rcv(skb); in ip6_list_rcv_finish()
124 if (!skb) in ip6_list_rcv_finish()
127 if (ip6_can_use_hint(skb, hint)) in ip6_list_rcv_finish()
128 skb_dst_copy(skb, hint); in ip6_list_rcv_finish()
130 ip6_rcv_finish_core(net, sk, skb); in ip6_list_rcv_finish()
131 dst = skb_dst(skb); in ip6_list_rcv_finish()
133 hint = ip6_extract_route_hint(net, skb); in ip6_list_rcv_finish()
142 list_add_tail(&skb->list, &sublist); in ip6_list_rcv_finish()
148 static struct sk_buff *ip6_rcv_core(struct sk_buff *skb, struct net_device *dev, in ip6_rcv_core() argument
156 if (skb->pkt_type == PACKET_OTHERHOST) { in ip6_rcv_core()
157 dev_core_stats_rx_otherhost_dropped_inc(skb->dev); in ip6_rcv_core()
158 kfree_skb_reason(skb, SKB_DROP_REASON_OTHERHOST); in ip6_rcv_core()
164 idev = __in6_dev_get(skb->dev); in ip6_rcv_core()
166 __IP6_UPD_PO_STATS(net, idev, IPSTATS_MIB_IN, skb->len); in ip6_rcv_core()
169 if ((skb = skb_share_check(skb, GFP_ATOMIC)) == NULL || in ip6_rcv_core()
177 memset(IP6CB(skb), 0, sizeof(struct inet6_skb_parm)); in ip6_rcv_core()
181 * be queued, we cannot refer to skb->dev anymore. in ip6_rcv_core()
185 * via the loopback interface (lo) here; skb->dev = loopback_dev. in ip6_rcv_core()
190 IP6CB(skb)->iif = skb_valid_dst(skb) ? ip6_dst_idev(skb_dst(skb))->dev->ifindex : dev->ifindex; in ip6_rcv_core()
192 if (unlikely(!pskb_may_pull(skb, sizeof(*hdr)))) in ip6_rcv_core()
195 hdr = ipv6_hdr(skb); in ip6_rcv_core()
205 max_t(unsigned short, 1, skb_shinfo(skb)->gso_segs)); in ip6_rcv_core()
225 if (!(skb->pkt_type == PACKET_LOOPBACK || in ip6_rcv_core()
236 (skb->pkt_type == PACKET_BROADCAST || in ip6_rcv_core()
237 skb->pkt_type == PACKET_MULTICAST) && in ip6_rcv_core()
260 skb->transport_header = skb->network_header + sizeof(*hdr); in ip6_rcv_core()
261 IP6CB(skb)->nhoff = offsetof(struct ipv6hdr, nexthdr); in ip6_rcv_core()
267 if (pkt_len + sizeof(struct ipv6hdr) > skb->len) { in ip6_rcv_core()
273 if (pskb_trim_rcsum(skb, pkt_len + sizeof(struct ipv6hdr))) in ip6_rcv_core()
275 hdr = ipv6_hdr(skb); in ip6_rcv_core()
279 if (ipv6_parse_hopopts(skb) < 0) { in ip6_rcv_core()
289 if (!skb_sk_is_prefetched(skb)) in ip6_rcv_core()
290 skb_orphan(skb); in ip6_rcv_core()
292 return skb; in ip6_rcv_core()
298 kfree_skb_reason(skb, reason); in ip6_rcv_core()
302 int ipv6_rcv(struct sk_buff *skb, struct net_device *dev, struct packet_type *pt, struct net_device… in ipv6_rcv() argument
304 struct net *net = dev_net(skb->dev); in ipv6_rcv()
306 skb = ip6_rcv_core(skb, dev, net); in ipv6_rcv()
307 if (skb == NULL) in ipv6_rcv()
310 net, NULL, skb, dev, NULL, in ipv6_rcv()
328 struct sk_buff *skb, *next; in ipv6_list_rcv() local
331 list_for_each_entry_safe(skb, next, head, list) { in ipv6_list_rcv()
332 struct net_device *dev = skb->dev; in ipv6_list_rcv()
335 skb_list_del_init(skb); in ipv6_list_rcv()
336 skb = ip6_rcv_core(skb, dev, net); in ipv6_list_rcv()
337 if (skb == NULL) in ipv6_list_rcv()
349 list_add_tail(&skb->list, &sublist); in ipv6_list_rcv()
361 void ip6_protocol_deliver_rcu(struct net *net, struct sk_buff *skb, int nexthdr, in ip6_protocol_deliver_rcu() argument
375 idev = ip6_dst_idev(skb_dst(skb)); in ip6_protocol_deliver_rcu()
376 nhoff = IP6CB(skb)->nhoff; in ip6_protocol_deliver_rcu()
378 if (!pskb_pull(skb, skb_transport_offset(skb))) in ip6_protocol_deliver_rcu()
380 nexthdr = skb_network_header(skb)[nhoff]; in ip6_protocol_deliver_rcu()
384 raw = raw6_local_deliver(skb, nexthdr); in ip6_protocol_deliver_rcu()
400 int sdif = inet6_sdif(skb); in ip6_protocol_deliver_rcu()
407 skb_postpull_rcsum(skb, skb_network_header(skb), in ip6_protocol_deliver_rcu()
408 skb_network_header_len(skb)); in ip6_protocol_deliver_rcu()
409 hdr = ipv6_hdr(skb); in ip6_protocol_deliver_rcu()
411 /* skb->dev passed may be master dev for vrfs. */ in ip6_protocol_deliver_rcu()
417 dev = skb->dev; in ip6_protocol_deliver_rcu()
423 !ipv6_is_mld(skb, nexthdr, skb_network_header_len(skb))) { in ip6_protocol_deliver_rcu()
429 if (!xfrm6_policy_check(NULL, XFRM_POLICY_IN, skb)) { in ip6_protocol_deliver_rcu()
433 nf_reset_ct(skb); in ip6_protocol_deliver_rcu()
437 skb); in ip6_protocol_deliver_rcu()
455 if (xfrm6_policy_check(NULL, XFRM_POLICY_IN, skb)) { in ip6_protocol_deliver_rcu()
458 icmpv6_send(skb, ICMPV6_PARAMPROB, in ip6_protocol_deliver_rcu()
464 kfree_skb_reason(skb, reason); in ip6_protocol_deliver_rcu()
467 consume_skb(skb); in ip6_protocol_deliver_rcu()
474 kfree_skb_reason(skb, reason); in ip6_protocol_deliver_rcu()
477 static int ip6_input_finish(struct net *net, struct sock *sk, struct sk_buff *skb) in ip6_input_finish() argument
479 skb_clear_delivery_time(skb); in ip6_input_finish()
480 ip6_protocol_deliver_rcu(net, skb, 0, false); in ip6_input_finish()
486 int ip6_input(struct sk_buff *skb) in ip6_input() argument
492 dev_net_rcu(skb->dev), NULL, skb, skb->dev, NULL, in ip6_input()
500 int ip6_mc_input(struct sk_buff *skb) in ip6_mc_input() argument
502 int sdif = inet6_sdif(skb); in ip6_mc_input()
507 __IP6_UPD_PO_STATS(dev_net(skb_dst(skb)->dev), in ip6_mc_input()
508 __in6_dev_get_safely(skb->dev), IPSTATS_MIB_INMCAST, in ip6_mc_input()
509 skb->len); in ip6_mc_input()
511 /* skb->dev passed may be master dev for vrfs. */ in ip6_mc_input()
514 dev = dev_get_by_index_rcu(dev_net(skb->dev), sdif); in ip6_mc_input()
517 kfree_skb(skb); in ip6_mc_input()
521 dev = skb->dev; in ip6_mc_input()
524 hdr = ipv6_hdr(skb); in ip6_mc_input()
533 if (atomic_read(&dev_net(skb->dev)->ipv6.devconf_all->mc_forwarding) && in ip6_mc_input()
536 likely(!(IP6CB(skb)->flags & IP6SKB_FORWARDED))) { in ip6_mc_input()
542 struct inet6_skb_parm *opt = IP6CB(skb); in ip6_mc_input()
561 offset = ipv6_skip_exthdr(skb, sizeof(*hdr), in ip6_mc_input()
566 if (ipv6_is_mld(skb, nexthdr, offset)) in ip6_mc_input()
575 skb2 = skb_clone(skb, GFP_ATOMIC); in ip6_mc_input()
577 skb2 = skb; in ip6_mc_input()
578 skb = NULL; in ip6_mc_input()
588 ip6_input(skb); in ip6_mc_input()
591 kfree_skb(skb); in ip6_mc_input()