Lines Matching refs:skb

60 static int ip6_finish_output2(struct net *net, struct sock *sk, struct sk_buff *skb)  in ip6_finish_output2()  argument
62 struct dst_entry *dst = skb_dst(skb); in ip6_finish_output2()
68 skb->protocol = htons(ETH_P_IPV6); in ip6_finish_output2()
69 skb->dev = dev; in ip6_finish_output2()
71 if (ipv6_addr_is_multicast(&ipv6_hdr(skb)->daddr)) { in ip6_finish_output2()
72 struct inet6_dev *idev = ip6_dst_idev(skb_dst(skb)); in ip6_finish_output2()
75 ((mroute6_socket(net, skb) && in ip6_finish_output2()
76 !(IP6CB(skb)->flags & IP6SKB_FORWARDED)) || in ip6_finish_output2()
77 ipv6_chk_mcast_addr(dev, &ipv6_hdr(skb)->daddr, in ip6_finish_output2()
78 &ipv6_hdr(skb)->saddr))) { in ip6_finish_output2()
79 struct sk_buff *newskb = skb_clone(skb, GFP_ATOMIC); in ip6_finish_output2()
89 if (ipv6_hdr(skb)->hop_limit == 0) { in ip6_finish_output2()
92 kfree_skb(skb); in ip6_finish_output2()
97 IP6_UPD_PO_STATS(net, idev, IPSTATS_MIB_OUTMCAST, skb->len); in ip6_finish_output2()
99 if (IPV6_ADDR_MC_SCOPE(&ipv6_hdr(skb)->daddr) <= in ip6_finish_output2()
102 kfree_skb(skb); in ip6_finish_output2()
108 nexthop = rt6_nexthop((struct rt6_info *)dst, &ipv6_hdr(skb)->daddr); in ip6_finish_output2()
113 ret = dst_neigh_output(dst, neigh, skb); in ip6_finish_output2()
120 kfree_skb(skb); in ip6_finish_output2()
124 static int ip6_finish_output(struct net *net, struct sock *sk, struct sk_buff *skb) in ip6_finish_output() argument
126 if ((skb->len > ip6_skb_dst_mtu(skb) && !skb_is_gso(skb)) || in ip6_finish_output()
127 dst_allfrag(skb_dst(skb)) || in ip6_finish_output()
128 (IP6CB(skb)->frag_max_size && skb->len > IP6CB(skb)->frag_max_size)) in ip6_finish_output()
129 return ip6_fragment(net, sk, skb, ip6_finish_output2); in ip6_finish_output()
131 return ip6_finish_output2(net, sk, skb); in ip6_finish_output()
134 int ip6_output(struct net *net, struct sock *sk, struct sk_buff *skb) in ip6_output() argument
136 struct net_device *dev = skb_dst(skb)->dev; in ip6_output()
137 struct inet6_dev *idev = ip6_dst_idev(skb_dst(skb)); in ip6_output()
141 kfree_skb(skb); in ip6_output()
146 net, sk, skb, NULL, dev, in ip6_output()
148 !(IP6CB(skb)->flags & IP6SKB_REROUTED)); in ip6_output()
157 int ip6_xmit(const struct sock *sk, struct sk_buff *skb, struct flowi6 *fl6, in ip6_xmit() argument
163 struct dst_entry *dst = skb_dst(skb); in ip6_xmit()
166 int seg_len = skb->len; in ip6_xmit()
180 if (skb_headroom(skb) < head_room) { in ip6_xmit()
181 struct sk_buff *skb2 = skb_realloc_headroom(skb, head_room); in ip6_xmit()
183 IP6_INC_STATS(net, ip6_dst_idev(skb_dst(skb)), in ip6_xmit()
185 kfree_skb(skb); in ip6_xmit()
188 consume_skb(skb); in ip6_xmit()
189 skb = skb2; in ip6_xmit()
193 skb_set_owner_w(skb, (struct sock *)sk); in ip6_xmit()
196 ipv6_push_frag_opts(skb, opt, &proto); in ip6_xmit()
198 ipv6_push_nfrag_opts(skb, opt, &proto, &first_hop); in ip6_xmit()
201 skb_push(skb, sizeof(struct ipv6hdr)); in ip6_xmit()
202 skb_reset_network_header(skb); in ip6_xmit()
203 hdr = ipv6_hdr(skb); in ip6_xmit()
213 ip6_flow_hdr(hdr, tclass, ip6_make_flowlabel(net, skb, fl6->flowlabel, in ip6_xmit()
223 skb->protocol = htons(ETH_P_IPV6); in ip6_xmit()
224 skb->priority = sk->sk_priority; in ip6_xmit()
225 skb->mark = sk->sk_mark; in ip6_xmit()
228 if ((skb->len <= mtu) || skb->ignore_df || skb_is_gso(skb)) { in ip6_xmit()
229 IP6_UPD_PO_STATS(net, ip6_dst_idev(skb_dst(skb)), in ip6_xmit()
230 IPSTATS_MIB_OUT, skb->len); in ip6_xmit()
235 net, (struct sock *)sk, skb, NULL, dst->dev, in ip6_xmit()
239 skb->dev = dst->dev; in ip6_xmit()
245 IP6_INC_STATS(net, ip6_dst_idev(skb_dst(skb)), IPSTATS_MIB_FRAGFAILS); in ip6_xmit()
246 kfree_skb(skb); in ip6_xmit()
251 static int ip6_call_ra_chain(struct sk_buff *skb, int sel) in ip6_call_ra_chain() argument
261 sk->sk_bound_dev_if == skb->dev->ifindex)) { in ip6_call_ra_chain()
263 struct sk_buff *skb2 = skb_clone(skb, GFP_ATOMIC); in ip6_call_ra_chain()
272 rawv6_rcv(last, skb); in ip6_call_ra_chain()
280 static int ip6_forward_proxy_check(struct sk_buff *skb) in ip6_forward_proxy_check() argument
282 struct ipv6hdr *hdr = ipv6_hdr(skb); in ip6_forward_proxy_check()
288 offset = ipv6_skip_exthdr(skb, sizeof(*hdr), &nexthdr, &frag_off); in ip6_forward_proxy_check()
297 if (!pskb_may_pull(skb, (skb_network_header(skb) + in ip6_forward_proxy_check()
298 offset + 1 - skb->data))) in ip6_forward_proxy_check()
301 icmp6 = (struct icmp6hdr *)(skb_network_header(skb) + offset); in ip6_forward_proxy_check()
325 dst_link_failure(skb); in ip6_forward_proxy_check()
333 struct sk_buff *skb) in ip6_forward_finish() argument
335 skb_sender_cpu_clear(skb); in ip6_forward_finish()
336 return dst_output(net, sk, skb); in ip6_forward_finish()
360 static bool ip6_pkt_too_big(const struct sk_buff *skb, unsigned int mtu) in ip6_pkt_too_big() argument
362 if (skb->len <= mtu) in ip6_pkt_too_big()
366 if (IP6CB(skb)->frag_max_size && IP6CB(skb)->frag_max_size > mtu) in ip6_pkt_too_big()
369 if (skb->ignore_df) in ip6_pkt_too_big()
372 if (skb_is_gso(skb) && skb_gso_network_seglen(skb) <= mtu) in ip6_pkt_too_big()
378 int ip6_forward(struct sk_buff *skb) in ip6_forward() argument
380 struct dst_entry *dst = skb_dst(skb); in ip6_forward()
381 struct ipv6hdr *hdr = ipv6_hdr(skb); in ip6_forward()
382 struct inet6_skb_parm *opt = IP6CB(skb); in ip6_forward()
389 if (skb->pkt_type != PACKET_HOST) in ip6_forward()
392 if (unlikely(skb->sk)) in ip6_forward()
395 if (skb_warn_if_lro(skb)) in ip6_forward()
398 if (!xfrm6_policy_check(NULL, XFRM_POLICY_FWD, skb)) { in ip6_forward()
404 skb_forward_csum(skb); in ip6_forward()
420 if (ip6_call_ra_chain(skb, ntohs(opt->ra))) in ip6_forward()
429 skb->dev = dst->dev; in ip6_forward()
430 icmpv6_send(skb, ICMPV6_TIME_EXCEED, ICMPV6_EXC_HOPLIMIT, 0); in ip6_forward()
434 kfree_skb(skb); in ip6_forward()
440 pneigh_lookup(&nd_tbl, net, &hdr->daddr, skb->dev, 0)) { in ip6_forward()
441 int proxied = ip6_forward_proxy_check(skb); in ip6_forward()
443 return ip6_input(skb); in ip6_forward()
451 if (!xfrm6_route_forward(skb)) { in ip6_forward()
456 dst = skb_dst(skb); in ip6_forward()
462 if (skb->dev == dst->dev && opt->srcrt == 0 && !skb_sec_path(skb)) { in ip6_forward()
484 ndisc_send_redirect(skb, target); in ip6_forward()
495 icmpv6_send(skb, ICMPV6_DEST_UNREACH, in ip6_forward()
505 if (ip6_pkt_too_big(skb, mtu)) { in ip6_forward()
507 skb->dev = dst->dev; in ip6_forward()
508 icmpv6_send(skb, ICMPV6_PKT_TOOBIG, 0, mtu); in ip6_forward()
513 kfree_skb(skb); in ip6_forward()
517 if (skb_cow(skb, dst->dev->hard_header_len)) { in ip6_forward()
523 hdr = ipv6_hdr(skb); in ip6_forward()
530 IP6_ADD_STATS_BH(net, ip6_dst_idev(dst), IPSTATS_MIB_OUTOCTETS, skb->len); in ip6_forward()
532 net, NULL, skb, skb->dev, dst->dev, in ip6_forward()
538 kfree_skb(skb); in ip6_forward()
559 int ip6_fragment(struct net *net, struct sock *sk, struct sk_buff *skb, in ip6_fragment() argument
563 struct rt6_info *rt = (struct rt6_info *)skb_dst(skb); in ip6_fragment()
564 struct ipv6_pinfo *np = skb->sk && !dev_recursion_level() ? in ip6_fragment()
565 inet6_sk(skb->sk) : NULL; in ip6_fragment()
574 hlen = ip6_find_1stfragopt(skb, &prevhdr); in ip6_fragment()
577 mtu = ip6_skb_dst_mtu(skb); in ip6_fragment()
582 if (unlikely(!skb->ignore_df && skb->len > mtu)) in ip6_fragment()
585 if (IP6CB(skb)->frag_max_size) { in ip6_fragment()
586 if (IP6CB(skb)->frag_max_size > mtu) in ip6_fragment()
590 mtu = IP6CB(skb)->frag_max_size; in ip6_fragment()
603 frag_id = ipv6_select_ident(net, &ipv6_hdr(skb)->daddr, in ip6_fragment()
604 &ipv6_hdr(skb)->saddr); in ip6_fragment()
606 if (skb->ip_summed == CHECKSUM_PARTIAL && in ip6_fragment()
607 (err = skb_checksum_help(skb))) in ip6_fragment()
611 if (skb_has_frag_list(skb)) { in ip6_fragment()
612 int first_len = skb_pagelen(skb); in ip6_fragment()
617 skb_cloned(skb) || in ip6_fragment()
618 skb_headroom(skb) < (hroom + sizeof(struct frag_hdr))) in ip6_fragment()
621 skb_walk_frags(skb, frag) { in ip6_fragment()
633 if (skb->sk) { in ip6_fragment()
634 frag->sk = skb->sk; in ip6_fragment()
637 skb->truesize -= frag->truesize; in ip6_fragment()
645 tmp_hdr = kmemdup(skb_network_header(skb), hlen, GFP_ATOMIC); in ip6_fragment()
647 IP6_INC_STATS(net, ip6_dst_idev(skb_dst(skb)), in ip6_fragment()
652 frag = skb_shinfo(skb)->frag_list; in ip6_fragment()
653 skb_frag_list_init(skb); in ip6_fragment()
655 __skb_pull(skb, hlen); in ip6_fragment()
656 fh = (struct frag_hdr *)__skb_push(skb, sizeof(struct frag_hdr)); in ip6_fragment()
657 __skb_push(skb, hlen); in ip6_fragment()
658 skb_reset_network_header(skb); in ip6_fragment()
659 memcpy(skb_network_header(skb), tmp_hdr, hlen); in ip6_fragment()
666 first_len = skb_pagelen(skb); in ip6_fragment()
667 skb->data_len = first_len - skb_headlen(skb); in ip6_fragment()
668 skb->len = first_len; in ip6_fragment()
669 ipv6_hdr(skb)->payload_len = htons(first_len - in ip6_fragment()
685 offset += skb->len - hlen - sizeof(struct frag_hdr); in ip6_fragment()
695 ip6_copy_metadata(frag, skb); in ip6_fragment()
698 err = output(net, sk, skb); in ip6_fragment()
706 skb = frag; in ip6_fragment()
707 frag = skb->next; in ip6_fragment()
708 skb->next = NULL; in ip6_fragment()
728 skb_walk_frags(skb, frag2) { in ip6_fragment()
733 skb->truesize += frag2->truesize; in ip6_fragment()
738 left = skb->len - hlen; /* Space per frame */ in ip6_fragment()
766 IP6_INC_STATS(net, ip6_dst_idev(skb_dst(skb)), in ip6_fragment()
776 ip6_copy_metadata(frag, skb); in ip6_fragment()
788 if (skb->sk) in ip6_fragment()
789 skb_set_owner_w(frag, skb->sk); in ip6_fragment()
794 skb_copy_from_linear_data(skb, skb_network_header(frag), hlen); in ip6_fragment()
806 BUG_ON(skb_copy_bits(skb, ptr, skb_transport_header(frag), in ip6_fragment()
826 IP6_INC_STATS(net, ip6_dst_idev(skb_dst(skb)), in ip6_fragment()
829 IP6_INC_STATS(net, ip6_dst_idev(skb_dst(skb)), in ip6_fragment()
831 consume_skb(skb); in ip6_fragment()
835 if (skb->sk && dst_allfrag(skb_dst(skb))) in ip6_fragment()
836 sk_nocaps_add(skb->sk, NETIF_F_GSO_MASK); in ip6_fragment()
838 skb->dev = skb_dst(skb)->dev; in ip6_fragment()
839 icmpv6_send(skb, ICMPV6_PKT_TOOBIG, 0, mtu); in ip6_fragment()
843 IP6_INC_STATS(net, ip6_dst_idev(skb_dst(skb)), in ip6_fragment()
845 kfree_skb(skb); in ip6_fragment()
1087 int odd, struct sk_buff *skb), in ip6_ufo_append_data() argument
1093 struct sk_buff *skb; in ip6_ufo_append_data() local
1100 skb = skb_peek_tail(queue); in ip6_ufo_append_data()
1101 if (!skb) { in ip6_ufo_append_data()
1102 skb = sock_alloc_send_skb(sk, in ip6_ufo_append_data()
1105 if (!skb) in ip6_ufo_append_data()
1109 skb_reserve(skb, hh_len); in ip6_ufo_append_data()
1112 skb_put(skb, fragheaderlen + transhdrlen); in ip6_ufo_append_data()
1115 skb_set_network_header(skb, exthdrlen); in ip6_ufo_append_data()
1118 skb->transport_header = skb->network_header + fragheaderlen; in ip6_ufo_append_data()
1120 skb->protocol = htons(ETH_P_IPV6); in ip6_ufo_append_data()
1121 skb->csum = 0; in ip6_ufo_append_data()
1123 __skb_queue_tail(queue, skb); in ip6_ufo_append_data()
1124 } else if (skb_is_gso(skb)) { in ip6_ufo_append_data()
1128 skb->ip_summed = CHECKSUM_PARTIAL; in ip6_ufo_append_data()
1132 skb_shinfo(skb)->gso_size = (mtu - fragheaderlen - in ip6_ufo_append_data()
1134 skb_shinfo(skb)->gso_type = SKB_GSO_UDP; in ip6_ufo_append_data()
1135 skb_shinfo(skb)->ip6_frag_id = ipv6_select_ident(sock_net(sk), in ip6_ufo_append_data()
1140 return skb_append_datato_frags(sk, skb, getfrag, from, in ip6_ufo_append_data()
1159 struct sk_buff *skb, in ip6_append_data_mtu() argument
1164 if (!skb) { in ip6_append_data_mtu()
1255 int len, int odd, struct sk_buff *skb), in __ip6_append_data() argument
1259 struct sk_buff *skb, *skb_prev = NULL; in __ip6_append_data() local
1274 skb = skb_peek_tail(queue); in __ip6_append_data()
1275 if (!skb) { in __ip6_append_data()
1352 (skb && skb_is_gso(skb))) && in __ip6_append_data()
1364 if (!skb) in __ip6_append_data()
1369 copy = (cork->length <= mtu && !(cork->flags & IPCORK_ALLFRAG) ? mtu : maxfraglen) - skb->len; in __ip6_append_data()
1371 copy = maxfraglen - skb->len; in __ip6_append_data()
1381 if (skb) in __ip6_append_data()
1382 fraggap = skb->len - maxfraglen; in __ip6_append_data()
1386 if (!skb || !skb_prev) in __ip6_append_data()
1388 fragheaderlen, skb, rt, in __ip6_append_data()
1391 skb_prev = skb; in __ip6_append_data()
1428 skb = sock_alloc_send_skb(sk, in __ip6_append_data()
1432 skb = NULL; in __ip6_append_data()
1435 skb = sock_wmalloc(sk, in __ip6_append_data()
1438 if (unlikely(!skb)) in __ip6_append_data()
1441 if (!skb) in __ip6_append_data()
1446 skb->protocol = htons(ETH_P_IPV6); in __ip6_append_data()
1447 skb->ip_summed = csummode; in __ip6_append_data()
1448 skb->csum = 0; in __ip6_append_data()
1450 skb_reserve(skb, hh_len + sizeof(struct frag_hdr) + in __ip6_append_data()
1454 skb_shinfo(skb)->tx_flags = tx_flags; in __ip6_append_data()
1456 skb_shinfo(skb)->tskey = tskey; in __ip6_append_data()
1462 data = skb_put(skb, fraglen); in __ip6_append_data()
1463 skb_set_network_header(skb, exthdrlen); in __ip6_append_data()
1465 skb->transport_header = (skb->network_header + in __ip6_append_data()
1468 skb->csum = skb_copy_and_csum_bits( in __ip6_append_data()
1472 skb->csum); in __ip6_append_data()
1480 kfree_skb(skb); in __ip6_append_data()
1482 } else if (copy > 0 && getfrag(from, data + transhdrlen, offset, copy, fraggap, skb) < 0) { in __ip6_append_data()
1484 kfree_skb(skb); in __ip6_append_data()
1497 __skb_queue_tail(queue, skb); in __ip6_append_data()
1507 off = skb->len; in __ip6_append_data()
1508 if (getfrag(from, skb_put(skb, copy), in __ip6_append_data()
1509 offset, copy, off, skb) < 0) { in __ip6_append_data()
1510 __skb_trim(skb, off); in __ip6_append_data()
1515 int i = skb_shinfo(skb)->nr_frags; in __ip6_append_data()
1521 if (!skb_can_coalesce(skb, i, pfrag->page, in __ip6_append_data()
1527 __skb_fill_page_desc(skb, i, pfrag->page, in __ip6_append_data()
1529 skb_shinfo(skb)->nr_frags = ++i; in __ip6_append_data()
1535 offset, copy, skb->len, skb) < 0) in __ip6_append_data()
1539 skb_frag_size_add(&skb_shinfo(skb)->frags[i - 1], copy); in __ip6_append_data()
1540 skb->len += copy; in __ip6_append_data()
1541 skb->data_len += copy; in __ip6_append_data()
1542 skb->truesize += copy; in __ip6_append_data()
1561 int odd, struct sk_buff *skb), in ip6_append_data() argument
1621 struct sk_buff *skb, *tmp_skb; in __ip6_make_skb() local
1632 skb = __skb_dequeue(queue); in __ip6_make_skb()
1633 if (!skb) in __ip6_make_skb()
1635 tail_skb = &(skb_shinfo(skb)->frag_list); in __ip6_make_skb()
1638 if (skb->data < skb_network_header(skb)) in __ip6_make_skb()
1639 __skb_pull(skb, skb_network_offset(skb)); in __ip6_make_skb()
1641 __skb_pull(tmp_skb, skb_network_header_len(skb)); in __ip6_make_skb()
1644 skb->len += tmp_skb->len; in __ip6_make_skb()
1645 skb->data_len += tmp_skb->len; in __ip6_make_skb()
1646 skb->truesize += tmp_skb->truesize; in __ip6_make_skb()
1652 skb->ignore_df = ip6_sk_ignore_df(sk); in __ip6_make_skb()
1655 __skb_pull(skb, skb_network_header_len(skb)); in __ip6_make_skb()
1657 ipv6_push_frag_opts(skb, opt, &proto); in __ip6_make_skb()
1659 ipv6_push_nfrag_opts(skb, opt, &proto, &final_dst); in __ip6_make_skb()
1661 skb_push(skb, sizeof(struct ipv6hdr)); in __ip6_make_skb()
1662 skb_reset_network_header(skb); in __ip6_make_skb()
1663 hdr = ipv6_hdr(skb); in __ip6_make_skb()
1666 ip6_make_flowlabel(net, skb, fl6->flowlabel, in __ip6_make_skb()
1673 skb->priority = sk->sk_priority; in __ip6_make_skb()
1674 skb->mark = sk->sk_mark; in __ip6_make_skb()
1676 skb_dst_set(skb, dst_clone(&rt->dst)); in __ip6_make_skb()
1677 IP6_UPD_PO_STATS(net, rt->rt6i_idev, IPSTATS_MIB_OUT, skb->len); in __ip6_make_skb()
1679 struct inet6_dev *idev = ip6_dst_idev(skb_dst(skb)); in __ip6_make_skb()
1681 ICMP6MSGOUT_INC_STATS(net, idev, icmp6_hdr(skb)->icmp6_type); in __ip6_make_skb()
1687 return skb; in __ip6_make_skb()
1690 int ip6_send_skb(struct sk_buff *skb) in ip6_send_skb() argument
1692 struct net *net = sock_net(skb->sk); in ip6_send_skb()
1693 struct rt6_info *rt = (struct rt6_info *)skb_dst(skb); in ip6_send_skb()
1696 err = ip6_local_out(net, skb->sk, skb); in ip6_send_skb()
1710 struct sk_buff *skb; in ip6_push_pending_frames() local
1712 skb = ip6_finish_skb(sk); in ip6_push_pending_frames()
1713 if (!skb) in ip6_push_pending_frames()
1716 return ip6_send_skb(skb); in ip6_push_pending_frames()
1725 struct sk_buff *skb; in __ip6_flush_pending_frames() local
1727 while ((skb = __skb_dequeue_tail(queue)) != NULL) { in __ip6_flush_pending_frames()
1728 if (skb_dst(skb)) in __ip6_flush_pending_frames()
1729 IP6_INC_STATS(sock_net(sk), ip6_dst_idev(skb_dst(skb)), in __ip6_flush_pending_frames()
1731 kfree_skb(skb); in __ip6_flush_pending_frames()
1746 int len, int odd, struct sk_buff *skb), in ip6_make_skb() argument