Lines Matching full:skb

26  *		Alexander Demenshin:	Missing sk/skb free in ip_queue_xmit
39 * silently drop skb instead of failing with -EPERM.
90 ip_fragment(struct net *net, struct sock *sk, struct sk_buff *skb,
102 int __ip_local_out(struct net *net, struct sock *sk, struct sk_buff *skb) in __ip_local_out() argument
104 struct iphdr *iph = ip_hdr(skb); in __ip_local_out()
108 iph_set_totlen(iph, skb->len); in __ip_local_out()
112 * skb to its handler for processing in __ip_local_out()
114 skb = l3mdev_ip_out(sk, skb); in __ip_local_out()
115 if (unlikely(!skb)) in __ip_local_out()
118 skb->protocol = htons(ETH_P_IP); in __ip_local_out()
121 net, sk, skb, NULL, skb_dst_dev(skb), in __ip_local_out()
125 int ip_local_out(struct net *net, struct sock *sk, struct sk_buff *skb) in ip_local_out() argument
129 err = __ip_local_out(net, sk, skb); in ip_local_out()
131 err = dst_output(net, sk, skb); in ip_local_out()
151 int ip_build_and_send_pkt(struct sk_buff *skb, const struct sock *sk, in ip_build_and_send_pkt() argument
156 struct rtable *rt = skb_rtable(skb); in ip_build_and_send_pkt()
161 skb_push(skb, sizeof(struct iphdr) + (opt ? opt->opt.optlen : 0)); in ip_build_and_send_pkt()
162 skb_reset_network_header(skb); in ip_build_and_send_pkt()
163 iph = ip_hdr(skb); in ip_build_and_send_pkt()
172 if (skb->len <= IPV4_MIN_MTU || ip_dont_fragment(sk, &rt->dst)) { in ip_build_and_send_pkt()
188 ip_options_build(skb, &opt->opt, daddr, rt); in ip_build_and_send_pkt()
191 skb->priority = READ_ONCE(sk->sk_priority); in ip_build_and_send_pkt()
192 if (!skb->mark) in ip_build_and_send_pkt()
193 skb->mark = READ_ONCE(sk->sk_mark); in ip_build_and_send_pkt()
196 return ip_local_out(net, skb->sk, skb); in ip_build_and_send_pkt()
200 static int ip_finish_output2(struct net *net, struct sock *sk, struct sk_buff *skb) in ip_finish_output2() argument
202 struct dst_entry *dst = skb_dst(skb); in ip_finish_output2()
210 IP_UPD_PO_STATS(net, IPSTATS_MIB_OUTMCAST, skb->len); in ip_finish_output2()
212 IP_UPD_PO_STATS(net, IPSTATS_MIB_OUTBCAST, skb->len); in ip_finish_output2()
215 IP_UPD_PO_STATS(net, IPSTATS_MIB_OUT, skb->len); in ip_finish_output2()
217 if (unlikely(skb_headroom(skb) < hh_len && dev->header_ops)) { in ip_finish_output2()
218 skb = skb_expand_head(skb, hh_len); in ip_finish_output2()
219 if (!skb) in ip_finish_output2()
224 int res = lwtunnel_xmit(skb); in ip_finish_output2()
231 neigh = ip_neigh_for_gw(rt, skb, &is_v6gw); in ip_finish_output2()
235 sock_confirm_neigh(skb, neigh); in ip_finish_output2()
237 res = neigh_output(neigh, skb, is_v6gw); in ip_finish_output2()
245 kfree_skb_reason(skb, SKB_DROP_REASON_NEIGH_CREATEFAIL); in ip_finish_output2()
250 struct sk_buff *skb, unsigned int mtu) in ip_finish_output_gso() argument
258 if (skb_gso_validate_network_len(skb, mtu)) in ip_finish_output_gso()
259 return ip_finish_output2(net, sk, skb); in ip_finish_output_gso()
264 * - Forwarding of a TCP GRO skb, when DF flag is not set. in ip_finish_output_gso()
265 * - Forwarding of an skb that arrived on a virtualization interface in ip_finish_output_gso()
268 * - Local GSO skb transmitted on an NETIF_F_TSO tunnel stacked over an in ip_finish_output_gso()
270 * - Arriving GRO skb (or GSO skb in a virtualized environment) that is in ip_finish_output_gso()
274 features = netif_skb_features(skb); in ip_finish_output_gso()
275 BUILD_BUG_ON(sizeof(*IPCB(skb)) > SKB_GSO_CB_OFFSET); in ip_finish_output_gso()
276 segs = skb_gso_segment(skb, features & ~NETIF_F_GSO_MASK); in ip_finish_output_gso()
278 kfree_skb(skb); in ip_finish_output_gso()
282 consume_skb(skb); in ip_finish_output_gso()
297 static int __ip_finish_output(struct net *net, struct sock *sk, struct sk_buff *skb) in __ip_finish_output() argument
303 if (skb_dst(skb)->xfrm) { in __ip_finish_output()
304 IPCB(skb)->flags |= IPSKB_REROUTED; in __ip_finish_output()
305 return dst_output(net, sk, skb); in __ip_finish_output()
308 mtu = ip_skb_dst_mtu(sk, skb); in __ip_finish_output()
309 if (skb_is_gso(skb)) in __ip_finish_output()
310 return ip_finish_output_gso(net, sk, skb, mtu); in __ip_finish_output()
312 if (skb->len > mtu || IPCB(skb)->frag_max_size) in __ip_finish_output()
313 return ip_fragment(net, sk, skb, mtu, ip_finish_output2); in __ip_finish_output()
315 return ip_finish_output2(net, sk, skb); in __ip_finish_output()
318 static int ip_finish_output(struct net *net, struct sock *sk, struct sk_buff *skb) in ip_finish_output() argument
322 ret = BPF_CGROUP_RUN_PROG_INET_EGRESS(sk, skb); in ip_finish_output()
325 return __ip_finish_output(net, sk, skb); in ip_finish_output()
327 return __ip_finish_output(net, sk, skb) ? : ret; in ip_finish_output()
329 kfree_skb_reason(skb, SKB_DROP_REASON_BPF_CGROUP_EGRESS); in ip_finish_output()
335 struct sk_buff *skb) in ip_mc_finish_output() argument
341 ret = BPF_CGROUP_RUN_PROG_INET_EGRESS(sk, skb); in ip_mc_finish_output()
349 kfree_skb_reason(skb, SKB_DROP_REASON_BPF_CGROUP_EGRESS); in ip_mc_finish_output()
353 /* Reset rt_iif so that inet_iif() will return skb->skb_iif. Setting in ip_mc_finish_output()
357 new_rt = rt_dst_clone(net->loopback_dev, skb_rtable(skb)); in ip_mc_finish_output()
360 skb_dst_drop(skb); in ip_mc_finish_output()
361 skb_dst_set(skb, &new_rt->dst); in ip_mc_finish_output()
364 err = dev_loopback_xmit(net, sk, skb); in ip_mc_finish_output()
368 int ip_mc_output(struct net *net, struct sock *sk, struct sk_buff *skb) in ip_mc_output() argument
370 struct rtable *rt = skb_rtable(skb); in ip_mc_output()
376 skb->dev = dev; in ip_mc_output()
377 skb->protocol = htons(ETH_P_IP); in ip_mc_output()
396 !(IPCB(skb)->flags & IPSKB_FORWARDED)) in ip_mc_output()
399 struct sk_buff *newskb = skb_clone(skb, GFP_ATOMIC); in ip_mc_output()
408 if (ip_hdr(skb)->ttl == 0) { in ip_mc_output()
409 kfree_skb(skb); in ip_mc_output()
415 struct sk_buff *newskb = skb_clone(skb, GFP_ATOMIC); in ip_mc_output()
423 net, sk, skb, NULL, skb->dev, in ip_mc_output()
425 !(IPCB(skb)->flags & IPSKB_REROUTED)); in ip_mc_output()
428 int ip_output(struct net *net, struct sock *sk, struct sk_buff *skb) in ip_output() argument
430 struct net_device *dev, *indev = skb->dev; in ip_output()
434 dev = skb_dst_dev_rcu(skb); in ip_output()
435 skb->dev = dev; in ip_output()
436 skb->protocol = htons(ETH_P_IP); in ip_output()
439 net, sk, skb, indev, dev, in ip_output()
441 !(IPCB(skb)->flags & IPSKB_REROUTED)); in ip_output()
462 /* Note: skb->sk can be different from sk, in case of tunnels */
463 int __ip_queue_xmit(struct sock *sk, struct sk_buff *skb, struct flowi *fl, in __ip_queue_xmit() argument
480 rt = skb_rtable(skb); in __ip_queue_xmit()
501 skb_dst_set_noref(skb, &rt->dst); in __ip_queue_xmit()
508 skb_push(skb, sizeof(struct iphdr) + (inet_opt ? inet_opt->opt.optlen : 0)); in __ip_queue_xmit()
509 skb_reset_network_header(skb); in __ip_queue_xmit()
510 iph = ip_hdr(skb); in __ip_queue_xmit()
512 if (ip_dont_fragment(sk, &rt->dst) && !skb->ignore_df) in __ip_queue_xmit()
520 /* Transport layer set skb->h.foo itself. */ in __ip_queue_xmit()
524 ip_options_build(skb, &inet_opt->opt, inet->inet_daddr, rt); in __ip_queue_xmit()
527 ip_select_ident_segs(net, skb, sk, in __ip_queue_xmit()
528 skb_shinfo(skb)->gso_segs ?: 1); in __ip_queue_xmit()
530 /* TODO : should we use skb->sk here instead of sk ? */ in __ip_queue_xmit()
531 skb->priority = READ_ONCE(sk->sk_priority); in __ip_queue_xmit()
532 skb->mark = READ_ONCE(sk->sk_mark); in __ip_queue_xmit()
534 res = ip_local_out(net, sk, skb); in __ip_queue_xmit()
541 kfree_skb_reason(skb, SKB_DROP_REASON_IP_OUTNOROUTES); in __ip_queue_xmit()
546 int ip_queue_xmit(struct sock *sk, struct sk_buff *skb, struct flowi *fl) in ip_queue_xmit() argument
548 return __ip_queue_xmit(sk, skb, fl, READ_ONCE(inet_sk(sk)->tos)); in ip_queue_xmit()
576 static int ip_fragment(struct net *net, struct sock *sk, struct sk_buff *skb, in ip_fragment() argument
580 struct iphdr *iph = ip_hdr(skb); in ip_fragment()
583 return ip_do_fragment(net, sk, skb, output); in ip_fragment()
585 if (unlikely(!skb->ignore_df || in ip_fragment()
586 (IPCB(skb)->frag_max_size && in ip_fragment()
587 IPCB(skb)->frag_max_size > mtu))) { in ip_fragment()
589 icmp_send(skb, ICMP_DEST_UNREACH, ICMP_FRAG_NEEDED, in ip_fragment()
591 kfree_skb(skb); in ip_fragment()
595 return ip_do_fragment(net, sk, skb, output); in ip_fragment()
598 void ip_fraglist_init(struct sk_buff *skb, struct iphdr *iph, in ip_fraglist_init() argument
601 unsigned int first_len = skb_pagelen(skb); in ip_fraglist_init()
603 iter->frag = skb_shinfo(skb)->frag_list; in ip_fraglist_init()
604 skb_frag_list_init(skb); in ip_fraglist_init()
610 skb->data_len = first_len - skb_headlen(skb); in ip_fraglist_init()
611 skb->len = first_len; in ip_fraglist_init()
618 void ip_fraglist_prepare(struct sk_buff *skb, struct ip_fraglist_iter *iter) in ip_fraglist_prepare() argument
633 ip_copy_metadata(frag, skb); in ip_fraglist_prepare()
634 iter->offset += skb->len - hlen; in ip_fraglist_prepare()
643 void ip_frag_init(struct sk_buff *skb, unsigned int hlen, in ip_frag_init() argument
647 struct iphdr *iph = ip_hdr(skb); in ip_frag_init()
654 state->left = skb->len - hlen; /* Space per frame */ in ip_frag_init()
671 * on the initial skb, so that all the following fragments in ip_frag_ipcb()
678 struct sk_buff *ip_frag_next(struct sk_buff *skb, struct ip_frag_state *state) in ip_frag_next() argument
702 ip_copy_metadata(skb2, skb); in ip_frag_next()
713 if (skb->sk) in ip_frag_next()
714 skb_set_owner_w(skb2, skb->sk); in ip_frag_next()
720 skb_copy_from_linear_data(skb, skb_network_header(skb2), state->hlen); in ip_frag_next()
725 if (skb_copy_bits(skb, state->ptr, skb_transport_header(skb2), len)) in ip_frag_next()
761 int ip_do_fragment(struct net *net, struct sock *sk, struct sk_buff *skb, in ip_do_fragment() argument
766 u8 tstamp_type = skb->tstamp_type; in ip_do_fragment()
767 struct rtable *rt = skb_rtable(skb); in ip_do_fragment()
770 ktime_t tstamp = skb->tstamp; in ip_do_fragment()
775 if (skb->ip_summed == CHECKSUM_PARTIAL && in ip_do_fragment()
776 (err = skb_checksum_help(skb))) in ip_do_fragment()
783 iph = ip_hdr(skb); in ip_do_fragment()
785 mtu = ip_skb_dst_mtu(sk, skb); in ip_do_fragment()
786 if (IPCB(skb)->frag_max_size && IPCB(skb)->frag_max_size < mtu) in ip_do_fragment()
787 mtu = IPCB(skb)->frag_max_size; in ip_do_fragment()
795 IPCB(skb)->flags |= IPSKB_FRAG_COMPLETE; in ip_do_fragment()
805 if (skb_has_frag_list(skb)) { in ip_do_fragment()
807 unsigned int first_len = skb_pagelen(skb); in ip_do_fragment()
812 skb_cloned(skb) || in ip_do_fragment()
813 skb_headroom(skb) < ll_rs) in ip_do_fragment()
816 skb_walk_frags(skb, frag) { in ip_do_fragment()
823 /* Partially cloned skb? */ in ip_do_fragment()
828 if (skb->sk) { in ip_do_fragment()
829 frag->sk = skb->sk; in ip_do_fragment()
832 skb->truesize -= frag->truesize; in ip_do_fragment()
836 ip_fraglist_init(skb, iph, hlen, &iter); in ip_do_fragment()
844 IPCB(iter.frag)->flags = IPCB(skb)->flags; in ip_do_fragment()
845 ip_fraglist_prepare(skb, &iter); in ip_do_fragment()
846 if (first_frag && IPCB(skb)->opt.optlen) { in ip_do_fragment()
852 IPCB(skb)->opt.optlen; in ip_do_fragment()
858 skb_set_delivery_time(skb, tstamp, tstamp_type); in ip_do_fragment()
859 err = output(net, sk, skb); in ip_do_fragment()
866 skb = ip_fraglist_next(&iter); in ip_do_fragment()
880 skb_walk_frags(skb, frag2) { in ip_do_fragment()
885 skb->truesize += frag2->truesize; in ip_do_fragment()
894 ip_frag_init(skb, hlen, ll_rs, mtu, IPCB(skb)->flags & IPSKB_FRAG_PMTU, in ip_do_fragment()
904 skb2 = ip_frag_next(skb, &state); in ip_do_fragment()
909 ip_frag_ipcb(skb, skb2, first_frag); in ip_do_fragment()
921 consume_skb(skb); in ip_do_fragment()
926 kfree_skb(skb); in ip_do_fragment()
933 ip_generic_getfrag(void *from, char *to, int offset, int len, int odd, struct sk_buff *skb) in ip_generic_getfrag() argument
937 if (skb->ip_summed == CHECKSUM_PARTIAL) { in ip_generic_getfrag()
944 skb->csum = csum_block_add(skb->csum, csum, odd); in ip_generic_getfrag()
956 int len, int odd, struct sk_buff *skb), in __ip_append_data() argument
962 struct sk_buff *skb; in __ip_append_data() local
978 skb = skb_peek_tail(queue); in __ip_append_data()
980 exthdrlen = !skb ? rt->dst.header_len : 0; in __ip_append_data()
1011 if (skb_zcopy(skb) && msg->msg_ubuf != skb_zcopy(skb)) in __ip_append_data()
1024 uarg = msg_zerocopy_realloc(sk, length, skb_zcopy(skb), in __ip_append_data()
1028 extra_uref = !skb_zcopy(skb); /* only ref on new uarg */ in __ip_append_data()
1035 skb_zcopy_set(skb, uarg, &extra_uref); in __ip_append_data()
1063 * We use calculated fragment length to generate chained skb, in __ip_append_data()
1068 if (!skb) in __ip_append_data()
1073 copy = mtu - skb->len; in __ip_append_data()
1075 copy = maxfraglen - skb->len; in __ip_append_data()
1085 skb_prev = skb; in __ip_append_data()
1127 skb = sock_alloc_send_skb(sk, alloclen, in __ip_append_data()
1130 skb = NULL; in __ip_append_data()
1133 skb = alloc_skb(alloclen, in __ip_append_data()
1135 if (unlikely(!skb)) in __ip_append_data()
1138 if (!skb) in __ip_append_data()
1144 skb->ip_summed = csummode; in __ip_append_data()
1145 skb->csum = 0; in __ip_append_data()
1146 skb_reserve(skb, hh_len); in __ip_append_data()
1151 data = skb_put(skb, fraglen + exthdrlen - pagedlen); in __ip_append_data()
1152 skb_set_network_header(skb, exthdrlen); in __ip_append_data()
1153 skb->transport_header = (skb->network_header + in __ip_append_data()
1158 skb->csum = skb_copy_and_csum_bits( in __ip_append_data()
1162 skb->csum); in __ip_append_data()
1174 copy, fraggap, skb) < 0) { in __ip_append_data()
1176 kfree_skb(skb); in __ip_append_data()
1189 skb_shinfo(skb)->tx_flags = cork->tx_flags; in __ip_append_data()
1191 skb_shinfo(skb)->tskey = tskey; in __ip_append_data()
1193 skb_zcopy_set(skb, uarg, &extra_uref); in __ip_append_data()
1196 skb_set_dst_pending_confirm(skb, 1); in __ip_append_data()
1201 if (!skb->destructor) { in __ip_append_data()
1202 skb->destructor = sock_wfree; in __ip_append_data()
1203 skb->sk = sk; in __ip_append_data()
1204 wmem_alloc_delta += skb->truesize; in __ip_append_data()
1206 __skb_queue_tail(queue, skb); in __ip_append_data()
1214 skb_tailroom(skb) >= copy) { in __ip_append_data()
1217 off = skb->len; in __ip_append_data()
1219 from, skb_put(skb, copy), in __ip_append_data()
1220 offset, copy, off, skb) < 0) { in __ip_append_data()
1221 __skb_trim(skb, off); in __ip_append_data()
1232 err = skb_splice_from_iter(skb, &msg->msg_iter, copy); in __ip_append_data()
1237 skb_shinfo(skb)->flags |= SKBFL_SHARED_FRAG; in __ip_append_data()
1240 int i = skb_shinfo(skb)->nr_frags; in __ip_append_data()
1246 skb_zcopy_downgrade_managed(skb); in __ip_append_data()
1247 if (!skb_can_coalesce(skb, i, pfrag->page, in __ip_append_data()
1253 __skb_fill_page_desc(skb, i, pfrag->page, in __ip_append_data()
1255 skb_shinfo(skb)->nr_frags = ++i; in __ip_append_data()
1262 offset, copy, skb->len, skb) < 0) in __ip_append_data()
1266 skb_frag_size_add(&skb_shinfo(skb)->frags[i - 1], copy); in __ip_append_data()
1267 skb_len_add(skb, copy); in __ip_append_data()
1270 err = skb_zerocopy_iter_dgram(skb, from, copy); in __ip_append_data()
1361 int odd, struct sk_buff *skb), in ip_append_data() argument
1403 struct sk_buff *skb, *tmp_skb; in __ip_make_skb() local
1413 skb = __skb_dequeue(queue); in __ip_make_skb()
1414 if (!skb) in __ip_make_skb()
1416 tail_skb = &(skb_shinfo(skb)->frag_list); in __ip_make_skb()
1418 /* move skb->data to ip header from ext header */ in __ip_make_skb()
1419 if (skb->data < skb_network_header(skb)) in __ip_make_skb()
1420 __skb_pull(skb, skb_network_offset(skb)); in __ip_make_skb()
1422 __skb_pull(tmp_skb, skb_network_header_len(skb)); in __ip_make_skb()
1425 skb->len += tmp_skb->len; in __ip_make_skb()
1426 skb->data_len += tmp_skb->len; in __ip_make_skb()
1427 skb->truesize += tmp_skb->truesize; in __ip_make_skb()
1436 skb->ignore_df = ip_sk_ignore_df(sk); in __ip_make_skb()
1444 (skb->len <= dst4_mtu(&rt->dst) && in __ip_make_skb()
1458 iph = ip_hdr(skb); in __ip_make_skb()
1466 ip_select_ident(net, skb, sk); in __ip_make_skb()
1470 ip_options_build(skb, opt, cork->addr, rt); in __ip_make_skb()
1473 skb->priority = cork->priority; in __ip_make_skb()
1474 skb->mark = cork->mark; in __ip_make_skb()
1476 skb_set_delivery_time(skb, cork->transmit_time, SKB_CLOCK_MONOTONIC); in __ip_make_skb()
1478 skb_set_delivery_type_by_clockid(skb, cork->transmit_time, sk->sk_clockid); in __ip_make_skb()
1484 skb_dst_set(skb, &rt->dst); in __ip_make_skb()
1490 * so icmphdr does not in skb linear region and can not get icmp_type in __ip_make_skb()
1491 * by icmp_hdr(skb)->type. in __ip_make_skb()
1497 icmp_type = icmp_hdr(skb)->type; in __ip_make_skb()
1503 return skb; in __ip_make_skb()
1506 int ip_send_skb(struct net *net, struct sk_buff *skb) in ip_send_skb() argument
1510 err = ip_local_out(net, skb->sk, skb); in ip_send_skb()
1523 struct sk_buff *skb; in ip_push_pending_frames() local
1525 skb = ip_finish_skb(sk, fl4); in ip_push_pending_frames()
1526 if (!skb) in ip_push_pending_frames()
1529 /* Netfilter gets whole the not fragmented skb. */ in ip_push_pending_frames()
1530 return ip_send_skb(sock_net(sk), skb); in ip_push_pending_frames()
1540 struct sk_buff *skb; in __ip_flush_pending_frames() local
1542 while ((skb = __skb_dequeue_tail(queue)) != NULL) in __ip_flush_pending_frames()
1543 kfree_skb(skb); in __ip_flush_pending_frames()
1556 int len, int odd, struct sk_buff *skb), in ip_make_skb() argument
1591 int len, int odd, struct sk_buff *skb) in ip_reply_glue_bits() argument
1596 skb->csum = csum_block_add(skb->csum, csum, odd); in ip_reply_glue_bits()
1605 struct sk_buff *skb, in ip_send_unicast_reply() argument
1615 struct rtable *rt = skb_rtable(skb); in ip_send_unicast_reply()
1621 if (__ip_options_echo(net, &replyopts->opt, skb, sopt)) in ip_send_unicast_reply()
1636 if (!oif && netif_index_is_l3_master(net, skb->skb_iif)) in ip_send_unicast_reply()
1637 oif = skb->skb_iif; in ip_send_unicast_reply()
1640 IP4_REPLY_MARK(net, skb->mark) ?: sk->sk_mark, in ip_send_unicast_reply()
1642 RT_SCOPE_UNIVERSE, ip_hdr(skb)->protocol, in ip_send_unicast_reply()
1645 tcp_hdr(skb)->source, tcp_hdr(skb)->dest, in ip_send_unicast_reply()
1647 security_skb_classify_flow(skb, flowi4_to_flowi_common(&fl4)); in ip_send_unicast_reply()
1654 sk->sk_protocol = ip_hdr(skb)->protocol; in ip_send_unicast_reply()