Lines Matching refs:skb

86 static void icmpv6_err(struct sk_buff *skb, struct inet6_skb_parm *opt,  in icmpv6_err()  argument
90 struct icmp6hdr *icmp6 = (struct icmp6hdr *) (skb->data + offset); in icmpv6_err()
91 struct net *net = dev_net(skb->dev); in icmpv6_err()
94 ip6_update_pmtu(skb, net, info, 0, 0); in icmpv6_err()
96 ip6_redirect(skb, net, skb->dev->ifindex, 0); in icmpv6_err()
100 ping_err(skb, offset, info); in icmpv6_err()
103 static int icmpv6_rcv(struct sk_buff *skb);
145 static bool is_ineligible(const struct sk_buff *skb) in is_ineligible() argument
147 int ptr = (u8 *)(ipv6_hdr(skb) + 1) - skb->data; in is_ineligible()
148 int len = skb->len - ptr; in is_ineligible()
149 __u8 nexthdr = ipv6_hdr(skb)->nexthdr; in is_ineligible()
155 ptr = ipv6_skip_exthdr(skb, ptr, &nexthdr, &frag_off); in is_ineligible()
160 tp = skb_header_pointer(skb, in is_ineligible()
227 static bool opt_unrec(struct sk_buff *skb, __u32 offset) in opt_unrec() argument
231 offset += skb_network_offset(skb); in opt_unrec()
232 op = skb_header_pointer(skb, offset, sizeof(_optval), &_optval); in opt_unrec()
241 struct sk_buff *skb; in icmpv6_push_pending_frames() local
245 skb = skb_peek(&sk->sk_write_queue); in icmpv6_push_pending_frames()
246 if (!skb) in icmpv6_push_pending_frames()
249 icmp6h = icmp6_hdr(skb); in icmpv6_push_pending_frames()
254 skb->csum = csum_partial(icmp6h, in icmpv6_push_pending_frames()
255 sizeof(struct icmp6hdr), skb->csum); in icmpv6_push_pending_frames()
259 skb->csum); in icmpv6_push_pending_frames()
263 skb_queue_walk(&sk->sk_write_queue, skb) { in icmpv6_push_pending_frames()
264 tmp_csum = csum_add(tmp_csum, skb->csum); in icmpv6_push_pending_frames()
280 struct sk_buff *skb; member
285 static int icmpv6_getfrag(void *from, char *to, int offset, int len, int odd, struct sk_buff *skb) in icmpv6_getfrag() argument
288 struct sk_buff *org_skb = msg->skb; in icmpv6_getfrag()
293 skb->csum = csum_block_add(skb->csum, csum, odd); in icmpv6_getfrag()
295 nf_ct_attach(skb, org_skb); in icmpv6_getfrag()
300 static void mip6_addr_swap(struct sk_buff *skb) in mip6_addr_swap() argument
302 struct ipv6hdr *iph = ipv6_hdr(skb); in mip6_addr_swap()
303 struct inet6_skb_parm *opt = IP6CB(skb); in mip6_addr_swap()
309 off = ipv6_find_tlv(skb, opt->dsthao, IPV6_TLV_HAO); in mip6_addr_swap()
312 (skb_network_header(skb) + off); in mip6_addr_swap()
320 static inline void mip6_addr_swap(struct sk_buff *skb) {} in mip6_addr_swap() argument
324 struct sk_buff *skb, in icmpv6_route_lookup() argument
360 err = xfrm_decode_session_reverse(skb, flowi6_to_flowi(&fl2), AF_INET6); in icmpv6_route_lookup()
390 static void icmp6_send(struct sk_buff *skb, u8 type, u8 code, __u32 info) in icmp6_send() argument
392 struct net *net = dev_net(skb->dev); in icmp6_send()
394 struct ipv6hdr *hdr = ipv6_hdr(skb); in icmp6_send()
407 u32 mark = IP6_REPLY_MARK(net, skb->mark); in icmp6_send()
409 if ((u8 *)hdr < skb->head || in icmp6_send()
410 (skb_network_header(skb) + sizeof(*hdr)) > skb_tail_pointer(skb)) in icmp6_send()
421 if (ipv6_chk_addr(net, &hdr->daddr, skb->dev, 0) || in icmp6_send()
422 ipv6_chk_acast_addr_src(net, skb->dev, &hdr->daddr)) in icmp6_send()
429 if (addr_type & IPV6_ADDR_MULTICAST || skb->pkt_type != PACKET_HOST) { in icmp6_send()
433 (opt_unrec(skb, info)))) in icmp6_send()
446 iif = skb->dev->ifindex; in icmp6_send()
462 if (is_ineligible(skb)) { in icmp6_send()
467 mip6_addr_swap(skb); in icmp6_send()
478 security_skb_classify_flow(skb, flowi6_to_flowi(&fl6)); in icmp6_send()
499 dst = icmpv6_route_lookup(net, skb, sk, &fl6); in icmp6_send()
505 msg.skb = skb; in icmp6_send()
506 msg.offset = skb_network_offset(skb); in icmp6_send()
509 len = skb->len - msg.offset; in icmp6_send()
517 idev = __in6_dev_get(skb->dev); in icmp6_send()
540 void icmpv6_param_prob(struct sk_buff *skb, u8 code, int pos) in icmpv6_param_prob() argument
542 icmp6_send(skb, ICMPV6_PARAMPROB, code, pos); in icmpv6_param_prob()
543 kfree_skb(skb); in icmpv6_param_prob()
546 static void icmpv6_echo_reply(struct sk_buff *skb) in icmpv6_echo_reply() argument
548 struct net *net = dev_net(skb->dev); in icmpv6_echo_reply()
553 struct icmp6hdr *icmph = icmp6_hdr(skb); in icmpv6_echo_reply()
561 u32 mark = IP6_REPLY_MARK(net, skb->mark); in icmpv6_echo_reply()
563 saddr = &ipv6_hdr(skb)->daddr; in icmpv6_echo_reply()
565 if (!ipv6_unicast_destination(skb) && in icmpv6_echo_reply()
567 ipv6_anycast_destination(skb))) in icmpv6_echo_reply()
575 fl6.daddr = ipv6_hdr(skb)->saddr; in icmpv6_echo_reply()
578 fl6.flowi6_oif = skb->dev->ifindex; in icmpv6_echo_reply()
581 security_skb_classify_flow(skb, flowi6_to_flowi(&fl6)); in icmpv6_echo_reply()
603 idev = __in6_dev_get(skb->dev); in icmpv6_echo_reply()
605 msg.skb = skb; in icmpv6_echo_reply()
609 tclass = ipv6_get_dsfield(ipv6_hdr(skb)); in icmpv6_echo_reply()
610 err = ip6_append_data(sk, icmpv6_getfrag, &msg, skb->len + sizeof(struct icmp6hdr), in icmpv6_echo_reply()
620 skb->len + sizeof(struct icmp6hdr)); in icmpv6_echo_reply()
627 void icmpv6_notify(struct sk_buff *skb, u8 type, u8 code, __be32 info) in icmpv6_notify() argument
633 struct net *net = dev_net(skb->dev); in icmpv6_notify()
635 if (!pskb_may_pull(skb, sizeof(struct ipv6hdr))) in icmpv6_notify()
638 nexthdr = ((struct ipv6hdr *)skb->data)->nexthdr; in icmpv6_notify()
641 inner_offset = ipv6_skip_exthdr(skb, sizeof(struct ipv6hdr), in icmpv6_notify()
650 if (!pskb_may_pull(skb, inner_offset+8)) in icmpv6_notify()
662 ipprot->err_handler(skb, NULL, type, code, inner_offset, info); in icmpv6_notify()
664 raw6_icmp_error(skb, nexthdr, type, code, inner_offset, info); in icmpv6_notify()
668 ICMP6_INC_STATS_BH(net, __in6_dev_get(skb->dev), ICMP6_MIB_INERRORS); in icmpv6_notify()
675 static int icmpv6_rcv(struct sk_buff *skb) in icmpv6_rcv() argument
677 struct net_device *dev = skb->dev; in icmpv6_rcv()
684 if (!xfrm6_policy_check(NULL, XFRM_POLICY_IN, skb)) { in icmpv6_rcv()
685 struct sec_path *sp = skb_sec_path(skb); in icmpv6_rcv()
692 if (!pskb_may_pull(skb, sizeof(*hdr) + sizeof(struct ipv6hdr))) in icmpv6_rcv()
695 nh = skb_network_offset(skb); in icmpv6_rcv()
696 skb_set_network_header(skb, sizeof(*hdr)); in icmpv6_rcv()
698 if (!xfrm6_policy_check_reverse(NULL, XFRM_POLICY_IN, skb)) in icmpv6_rcv()
701 skb_set_network_header(skb, nh); in icmpv6_rcv()
706 saddr = &ipv6_hdr(skb)->saddr; in icmpv6_rcv()
707 daddr = &ipv6_hdr(skb)->daddr; in icmpv6_rcv()
709 if (skb_checksum_validate(skb, IPPROTO_ICMPV6, ip6_compute_pseudo)) { in icmpv6_rcv()
715 if (!pskb_pull(skb, sizeof(*hdr))) in icmpv6_rcv()
718 hdr = icmp6_hdr(skb); in icmpv6_rcv()
726 icmpv6_echo_reply(skb); in icmpv6_rcv()
730 success = ping_rcv(skb); in icmpv6_rcv()
739 if (!pskb_may_pull(skb, sizeof(struct ipv6hdr))) in icmpv6_rcv()
741 hdr = icmp6_hdr(skb); in icmpv6_rcv()
750 icmpv6_notify(skb, type, hdr->icmp6_code, hdr->icmp6_mtu); in icmpv6_rcv()
758 ndisc_rcv(skb); in icmpv6_rcv()
762 igmp6_event_query(skb); in icmpv6_rcv()
766 igmp6_event_report(skb); in icmpv6_rcv()
791 icmpv6_notify(skb, type, hdr->icmp6_code, hdr->icmp6_mtu); in icmpv6_rcv()
798 consume_skb(skb); in icmpv6_rcv()
800 kfree_skb(skb); in icmpv6_rcv()
809 kfree_skb(skb); in icmpv6_rcv()