Lines Matching refs:skb

87 static void icmpv6_err(struct sk_buff *skb, struct inet6_skb_parm *opt,  in icmpv6_err()  argument
91 struct icmp6hdr *icmp6 = (struct icmp6hdr *) (skb->data + offset); in icmpv6_err()
92 struct net *net = dev_net(skb->dev); in icmpv6_err()
95 ip6_update_pmtu(skb, net, info, 0, 0); in icmpv6_err()
97 ip6_redirect(skb, net, skb->dev->ifindex, 0); in icmpv6_err()
101 ping_err(skb, offset, info); in icmpv6_err()
104 static int icmpv6_rcv(struct sk_buff *skb);
146 static bool is_ineligible(const struct sk_buff *skb) in is_ineligible() argument
148 int ptr = (u8 *)(ipv6_hdr(skb) + 1) - skb->data; in is_ineligible()
149 int len = skb->len - ptr; in is_ineligible()
150 __u8 nexthdr = ipv6_hdr(skb)->nexthdr; in is_ineligible()
156 ptr = ipv6_skip_exthdr(skb, ptr, &nexthdr, &frag_off); in is_ineligible()
161 tp = skb_header_pointer(skb, in is_ineligible()
228 static bool opt_unrec(struct sk_buff *skb, __u32 offset) in opt_unrec() argument
232 offset += skb_network_offset(skb); in opt_unrec()
233 op = skb_header_pointer(skb, offset, sizeof(_optval), &_optval); in opt_unrec()
242 struct sk_buff *skb; in icmpv6_push_pending_frames() local
246 skb = skb_peek(&sk->sk_write_queue); in icmpv6_push_pending_frames()
247 if (!skb) in icmpv6_push_pending_frames()
250 icmp6h = icmp6_hdr(skb); in icmpv6_push_pending_frames()
255 skb->csum = csum_partial(icmp6h, in icmpv6_push_pending_frames()
256 sizeof(struct icmp6hdr), skb->csum); in icmpv6_push_pending_frames()
260 skb->csum); in icmpv6_push_pending_frames()
264 skb_queue_walk(&sk->sk_write_queue, skb) { in icmpv6_push_pending_frames()
265 tmp_csum = csum_add(tmp_csum, skb->csum); in icmpv6_push_pending_frames()
281 struct sk_buff *skb; member
286 static int icmpv6_getfrag(void *from, char *to, int offset, int len, int odd, struct sk_buff *skb) in icmpv6_getfrag() argument
289 struct sk_buff *org_skb = msg->skb; in icmpv6_getfrag()
294 skb->csum = csum_block_add(skb->csum, csum, odd); in icmpv6_getfrag()
296 nf_ct_attach(skb, org_skb); in icmpv6_getfrag()
301 static void mip6_addr_swap(struct sk_buff *skb) in mip6_addr_swap() argument
303 struct ipv6hdr *iph = ipv6_hdr(skb); in mip6_addr_swap()
304 struct inet6_skb_parm *opt = IP6CB(skb); in mip6_addr_swap()
310 off = ipv6_find_tlv(skb, opt->dsthao, IPV6_TLV_HAO); in mip6_addr_swap()
313 (skb_network_header(skb) + off); in mip6_addr_swap()
321 static inline void mip6_addr_swap(struct sk_buff *skb) {} in mip6_addr_swap() argument
325 struct sk_buff *skb, in icmpv6_route_lookup() argument
361 err = xfrm_decode_session_reverse(skb, flowi6_to_flowi(&fl2), AF_INET6); in icmpv6_route_lookup()
391 static void icmp6_send(struct sk_buff *skb, u8 type, u8 code, __u32 info) in icmp6_send() argument
393 struct net *net = dev_net(skb->dev); in icmp6_send()
395 struct ipv6hdr *hdr = ipv6_hdr(skb); in icmp6_send()
408 u32 mark = IP6_REPLY_MARK(net, skb->mark); in icmp6_send()
410 if ((u8 *)hdr < skb->head || in icmp6_send()
411 (skb_network_header(skb) + sizeof(*hdr)) > skb_tail_pointer(skb)) in icmp6_send()
422 if (ipv6_chk_addr(net, &hdr->daddr, skb->dev, 0) || in icmp6_send()
423 ipv6_chk_acast_addr_src(net, skb->dev, &hdr->daddr)) in icmp6_send()
430 if (addr_type & IPV6_ADDR_MULTICAST || skb->pkt_type != PACKET_HOST) { in icmp6_send()
434 (opt_unrec(skb, info)))) in icmp6_send()
447 iif = skb->dev->ifindex; in icmp6_send()
464 if (is_ineligible(skb)) { in icmp6_send()
470 mip6_addr_swap(skb); in icmp6_send()
481 security_skb_classify_flow(skb, flowi6_to_flowi(&fl6)); in icmp6_send()
503 fl6.flowi6_oif = l3mdev_master_ifindex(skb->dev); in icmp6_send()
505 dst = icmpv6_route_lookup(net, skb, sk, &fl6); in icmp6_send()
511 msg.skb = skb; in icmp6_send()
512 msg.offset = skb_network_offset(skb); in icmp6_send()
515 len = skb->len - msg.offset; in icmp6_send()
524 idev = __in6_dev_get(skb->dev); in icmp6_send()
547 void icmpv6_param_prob(struct sk_buff *skb, u8 code, int pos) in icmpv6_param_prob() argument
549 icmp6_send(skb, ICMPV6_PARAMPROB, code, pos); in icmpv6_param_prob()
550 kfree_skb(skb); in icmpv6_param_prob()
553 static void icmpv6_echo_reply(struct sk_buff *skb) in icmpv6_echo_reply() argument
555 struct net *net = dev_net(skb->dev); in icmpv6_echo_reply()
560 struct icmp6hdr *icmph = icmp6_hdr(skb); in icmpv6_echo_reply()
568 u32 mark = IP6_REPLY_MARK(net, skb->mark); in icmpv6_echo_reply()
570 saddr = &ipv6_hdr(skb)->daddr; in icmpv6_echo_reply()
572 if (!ipv6_unicast_destination(skb) && in icmpv6_echo_reply()
574 ipv6_anycast_destination(skb_dst(skb), saddr))) in icmpv6_echo_reply()
582 fl6.daddr = ipv6_hdr(skb)->saddr; in icmpv6_echo_reply()
585 fl6.flowi6_oif = l3mdev_fib_oif(skb->dev); in icmpv6_echo_reply()
588 security_skb_classify_flow(skb, flowi6_to_flowi(&fl6)); in icmpv6_echo_reply()
610 idev = __in6_dev_get(skb->dev); in icmpv6_echo_reply()
612 msg.skb = skb; in icmpv6_echo_reply()
616 tclass = ipv6_get_dsfield(ipv6_hdr(skb)); in icmpv6_echo_reply()
617 err = ip6_append_data(sk, icmpv6_getfrag, &msg, skb->len + sizeof(struct icmp6hdr), in icmpv6_echo_reply()
627 skb->len + sizeof(struct icmp6hdr)); in icmpv6_echo_reply()
634 void icmpv6_notify(struct sk_buff *skb, u8 type, u8 code, __be32 info) in icmpv6_notify() argument
640 struct net *net = dev_net(skb->dev); in icmpv6_notify()
642 if (!pskb_may_pull(skb, sizeof(struct ipv6hdr))) in icmpv6_notify()
645 nexthdr = ((struct ipv6hdr *)skb->data)->nexthdr; in icmpv6_notify()
648 inner_offset = ipv6_skip_exthdr(skb, sizeof(struct ipv6hdr), in icmpv6_notify()
657 if (!pskb_may_pull(skb, inner_offset+8)) in icmpv6_notify()
669 ipprot->err_handler(skb, NULL, type, code, inner_offset, info); in icmpv6_notify()
671 raw6_icmp_error(skb, nexthdr, type, code, inner_offset, info); in icmpv6_notify()
675 ICMP6_INC_STATS_BH(net, __in6_dev_get(skb->dev), ICMP6_MIB_INERRORS); in icmpv6_notify()
682 static int icmpv6_rcv(struct sk_buff *skb) in icmpv6_rcv() argument
684 struct net_device *dev = skb->dev; in icmpv6_rcv()
691 if (!xfrm6_policy_check(NULL, XFRM_POLICY_IN, skb)) { in icmpv6_rcv()
692 struct sec_path *sp = skb_sec_path(skb); in icmpv6_rcv()
699 if (!pskb_may_pull(skb, sizeof(*hdr) + sizeof(struct ipv6hdr))) in icmpv6_rcv()
702 nh = skb_network_offset(skb); in icmpv6_rcv()
703 skb_set_network_header(skb, sizeof(*hdr)); in icmpv6_rcv()
705 if (!xfrm6_policy_check_reverse(NULL, XFRM_POLICY_IN, skb)) in icmpv6_rcv()
708 skb_set_network_header(skb, nh); in icmpv6_rcv()
713 saddr = &ipv6_hdr(skb)->saddr; in icmpv6_rcv()
714 daddr = &ipv6_hdr(skb)->daddr; in icmpv6_rcv()
716 if (skb_checksum_validate(skb, IPPROTO_ICMPV6, ip6_compute_pseudo)) { in icmpv6_rcv()
722 if (!pskb_pull(skb, sizeof(*hdr))) in icmpv6_rcv()
725 hdr = icmp6_hdr(skb); in icmpv6_rcv()
733 icmpv6_echo_reply(skb); in icmpv6_rcv()
737 success = ping_rcv(skb); in icmpv6_rcv()
746 if (!pskb_may_pull(skb, sizeof(struct ipv6hdr))) in icmpv6_rcv()
748 hdr = icmp6_hdr(skb); in icmpv6_rcv()
757 icmpv6_notify(skb, type, hdr->icmp6_code, hdr->icmp6_mtu); in icmpv6_rcv()
765 ndisc_rcv(skb); in icmpv6_rcv()
769 igmp6_event_query(skb); in icmpv6_rcv()
773 igmp6_event_report(skb); in icmpv6_rcv()
799 icmpv6_notify(skb, type, hdr->icmp6_code, hdr->icmp6_mtu); in icmpv6_rcv()
806 consume_skb(skb); in icmpv6_rcv()
808 kfree_skb(skb); in icmpv6_rcv()
817 kfree_skb(skb); in icmpv6_rcv()