Lines Matching refs:skb
87 ip_fragment(struct net *net, struct sock *sk, struct sk_buff *skb,
99 int __ip_local_out(struct net *net, struct sock *sk, struct sk_buff *skb) in __ip_local_out() argument
101 struct iphdr *iph = ip_hdr(skb); in __ip_local_out()
103 iph->tot_len = htons(skb->len); in __ip_local_out()
106 net, sk, skb, NULL, skb_dst(skb)->dev, in __ip_local_out()
110 int ip_local_out(struct net *net, struct sock *sk, struct sk_buff *skb) in ip_local_out() argument
114 err = __ip_local_out(net, sk, skb); in ip_local_out()
116 err = dst_output(net, sk, skb); in ip_local_out()
135 int ip_build_and_send_pkt(struct sk_buff *skb, const struct sock *sk, in ip_build_and_send_pkt() argument
139 struct rtable *rt = skb_rtable(skb); in ip_build_and_send_pkt()
144 skb_push(skb, sizeof(struct iphdr) + (opt ? opt->opt.optlen : 0)); in ip_build_and_send_pkt()
145 skb_reset_network_header(skb); in ip_build_and_send_pkt()
146 iph = ip_hdr(skb); in ip_build_and_send_pkt()
164 ip_options_build(skb, &opt->opt, daddr, rt, 0); in ip_build_and_send_pkt()
167 skb->priority = sk->sk_priority; in ip_build_and_send_pkt()
168 skb->mark = sk->sk_mark; in ip_build_and_send_pkt()
171 return ip_local_out(net, skb->sk, skb); in ip_build_and_send_pkt()
175 static int ip_finish_output2(struct net *net, struct sock *sk, struct sk_buff *skb) in ip_finish_output2() argument
177 struct dst_entry *dst = skb_dst(skb); in ip_finish_output2()
185 IP_UPD_PO_STATS(net, IPSTATS_MIB_OUTMCAST, skb->len); in ip_finish_output2()
187 IP_UPD_PO_STATS(net, IPSTATS_MIB_OUTBCAST, skb->len); in ip_finish_output2()
190 if (unlikely(skb_headroom(skb) < hh_len && dev->header_ops)) { in ip_finish_output2()
193 skb2 = skb_realloc_headroom(skb, LL_RESERVED_SPACE(dev)); in ip_finish_output2()
195 kfree_skb(skb); in ip_finish_output2()
198 if (skb->sk) in ip_finish_output2()
199 skb_set_owner_w(skb2, skb->sk); in ip_finish_output2()
200 consume_skb(skb); in ip_finish_output2()
201 skb = skb2; in ip_finish_output2()
205 nexthop = (__force u32) rt_nexthop(rt, ip_hdr(skb)->daddr); in ip_finish_output2()
210 int res = dst_neigh_output(dst, neigh, skb); in ip_finish_output2()
219 kfree_skb(skb); in ip_finish_output2()
224 struct sk_buff *skb, unsigned int mtu) in ip_finish_output_gso() argument
231 if (((IPCB(skb)->flags & IPSKB_FORWARDED) == 0) || in ip_finish_output_gso()
232 skb_gso_network_seglen(skb) <= mtu) in ip_finish_output_gso()
233 return ip_finish_output2(net, sk, skb); in ip_finish_output_gso()
242 features = netif_skb_features(skb); in ip_finish_output_gso()
243 BUILD_BUG_ON(sizeof(*IPCB(skb)) > SKB_SGO_CB_OFFSET); in ip_finish_output_gso()
244 segs = skb_gso_segment(skb, features & ~NETIF_F_GSO_MASK); in ip_finish_output_gso()
246 kfree_skb(skb); in ip_finish_output_gso()
250 consume_skb(skb); in ip_finish_output_gso()
267 static int ip_finish_output(struct net *net, struct sock *sk, struct sk_buff *skb) in ip_finish_output() argument
273 if (skb_dst(skb)->xfrm) { in ip_finish_output()
274 IPCB(skb)->flags |= IPSKB_REROUTED; in ip_finish_output()
275 return dst_output(net, sk, skb); in ip_finish_output()
278 mtu = ip_skb_dst_mtu(skb); in ip_finish_output()
279 if (skb_is_gso(skb)) in ip_finish_output()
280 return ip_finish_output_gso(net, sk, skb, mtu); in ip_finish_output()
282 if (skb->len > mtu || (IPCB(skb)->flags & IPSKB_FRAG_PMTU)) in ip_finish_output()
283 return ip_fragment(net, sk, skb, mtu, ip_finish_output2); in ip_finish_output()
285 return ip_finish_output2(net, sk, skb); in ip_finish_output()
288 int ip_mc_output(struct net *net, struct sock *sk, struct sk_buff *skb) in ip_mc_output() argument
290 struct rtable *rt = skb_rtable(skb); in ip_mc_output()
296 IP_UPD_PO_STATS(net, IPSTATS_MIB_OUT, skb->len); in ip_mc_output()
298 skb->dev = dev; in ip_mc_output()
299 skb->protocol = htons(ETH_P_IP); in ip_mc_output()
318 !(IPCB(skb)->flags & IPSKB_FORWARDED)) in ip_mc_output()
321 struct sk_buff *newskb = skb_clone(skb, GFP_ATOMIC); in ip_mc_output()
330 if (ip_hdr(skb)->ttl == 0) { in ip_mc_output()
331 kfree_skb(skb); in ip_mc_output()
337 struct sk_buff *newskb = skb_clone(skb, GFP_ATOMIC); in ip_mc_output()
345 net, sk, skb, NULL, skb->dev, in ip_mc_output()
347 !(IPCB(skb)->flags & IPSKB_REROUTED)); in ip_mc_output()
350 int ip_output(struct net *net, struct sock *sk, struct sk_buff *skb) in ip_output() argument
352 struct net_device *dev = skb_dst(skb)->dev; in ip_output()
354 IP_UPD_PO_STATS(net, IPSTATS_MIB_OUT, skb->len); in ip_output()
356 skb->dev = dev; in ip_output()
357 skb->protocol = htons(ETH_P_IP); in ip_output()
360 net, sk, skb, NULL, dev, in ip_output()
362 !(IPCB(skb)->flags & IPSKB_REROUTED)); in ip_output()
380 int ip_queue_xmit(struct sock *sk, struct sk_buff *skb, struct flowi *fl) in ip_queue_xmit() argument
396 rt = skb_rtable(skb); in ip_queue_xmit()
425 skb_dst_set_noref(skb, &rt->dst); in ip_queue_xmit()
432 skb_push(skb, sizeof(struct iphdr) + (inet_opt ? inet_opt->opt.optlen : 0)); in ip_queue_xmit()
433 skb_reset_network_header(skb); in ip_queue_xmit()
434 iph = ip_hdr(skb); in ip_queue_xmit()
436 if (ip_dont_fragment(sk, &rt->dst) && !skb->ignore_df) in ip_queue_xmit()
448 ip_options_build(skb, &inet_opt->opt, inet->inet_daddr, rt, 0); in ip_queue_xmit()
451 ip_select_ident_segs(net, skb, sk, in ip_queue_xmit()
452 skb_shinfo(skb)->gso_segs ?: 1); in ip_queue_xmit()
455 skb->priority = sk->sk_priority; in ip_queue_xmit()
456 skb->mark = sk->sk_mark; in ip_queue_xmit()
458 res = ip_local_out(net, sk, skb); in ip_queue_xmit()
465 kfree_skb(skb); in ip_queue_xmit()
493 static int ip_fragment(struct net *net, struct sock *sk, struct sk_buff *skb, in ip_fragment() argument
497 struct iphdr *iph = ip_hdr(skb); in ip_fragment()
500 return ip_do_fragment(net, sk, skb, output); in ip_fragment()
502 if (unlikely(!skb->ignore_df || in ip_fragment()
503 (IPCB(skb)->frag_max_size && in ip_fragment()
504 IPCB(skb)->frag_max_size > mtu))) { in ip_fragment()
506 icmp_send(skb, ICMP_DEST_UNREACH, ICMP_FRAG_NEEDED, in ip_fragment()
508 kfree_skb(skb); in ip_fragment()
512 return ip_do_fragment(net, sk, skb, output); in ip_fragment()
522 int ip_do_fragment(struct net *net, struct sock *sk, struct sk_buff *skb, in ip_do_fragment() argument
532 struct rtable *rt = skb_rtable(skb); in ip_do_fragment()
538 if (skb->ip_summed == CHECKSUM_PARTIAL && in ip_do_fragment()
539 (err = skb_checksum_help(skb))) in ip_do_fragment()
546 iph = ip_hdr(skb); in ip_do_fragment()
548 mtu = ip_skb_dst_mtu(skb); in ip_do_fragment()
549 if (IPCB(skb)->frag_max_size && IPCB(skb)->frag_max_size < mtu) in ip_do_fragment()
550 mtu = IPCB(skb)->frag_max_size; in ip_do_fragment()
558 IPCB(skb)->flags |= IPSKB_FRAG_COMPLETE; in ip_do_fragment()
567 if (skb_has_frag_list(skb)) { in ip_do_fragment()
569 int first_len = skb_pagelen(skb); in ip_do_fragment()
574 skb_cloned(skb)) in ip_do_fragment()
577 skb_walk_frags(skb, frag) { in ip_do_fragment()
589 if (skb->sk) { in ip_do_fragment()
590 frag->sk = skb->sk; in ip_do_fragment()
593 skb->truesize -= frag->truesize; in ip_do_fragment()
600 frag = skb_shinfo(skb)->frag_list; in ip_do_fragment()
601 skb_frag_list_init(skb); in ip_do_fragment()
602 skb->data_len = first_len - skb_headlen(skb); in ip_do_fragment()
603 skb->len = first_len; in ip_do_fragment()
619 ip_copy_metadata(frag, skb); in ip_do_fragment()
622 offset += skb->len - hlen; in ip_do_fragment()
630 err = output(net, sk, skb); in ip_do_fragment()
637 skb = frag; in ip_do_fragment()
638 frag = skb->next; in ip_do_fragment()
639 skb->next = NULL; in ip_do_fragment()
648 skb = frag->next; in ip_do_fragment()
650 frag = skb; in ip_do_fragment()
656 skb_walk_frags(skb, frag2) { in ip_do_fragment()
661 skb->truesize += frag2->truesize; in ip_do_fragment()
666 iph = ip_hdr(skb); in ip_do_fragment()
668 left = skb->len - hlen; /* Space per frame */ in ip_do_fragment()
706 ip_copy_metadata(skb2, skb); in ip_do_fragment()
717 if (skb->sk) in ip_do_fragment()
718 skb_set_owner_w(skb2, skb->sk); in ip_do_fragment()
724 skb_copy_from_linear_data(skb, skb_network_header(skb2), hlen); in ip_do_fragment()
729 if (skb_copy_bits(skb, ptr, skb_transport_header(skb2), len)) in ip_do_fragment()
739 if (IPCB(skb)->flags & IPSKB_FRAG_PMTU) in ip_do_fragment()
749 ip_options_fragment(skb); in ip_do_fragment()
773 consume_skb(skb); in ip_do_fragment()
778 kfree_skb(skb); in ip_do_fragment()
785 ip_generic_getfrag(void *from, char *to, int offset, int len, int odd, struct sk_buff *skb) in ip_generic_getfrag() argument
789 if (skb->ip_summed == CHECKSUM_PARTIAL) { in ip_generic_getfrag()
796 skb->csum = csum_block_add(skb->csum, csum, odd); in ip_generic_getfrag()
816 int odd, struct sk_buff *skb), in ip_ufo_append_data() argument
820 struct sk_buff *skb; in ip_ufo_append_data() local
827 skb = skb_peek_tail(queue); in ip_ufo_append_data()
828 if (!skb) { in ip_ufo_append_data()
829 skb = sock_alloc_send_skb(sk, in ip_ufo_append_data()
833 if (!skb) in ip_ufo_append_data()
837 skb_reserve(skb, hh_len); in ip_ufo_append_data()
840 skb_put(skb, fragheaderlen + transhdrlen); in ip_ufo_append_data()
843 skb_reset_network_header(skb); in ip_ufo_append_data()
846 skb->transport_header = skb->network_header + fragheaderlen; in ip_ufo_append_data()
848 skb->csum = 0; in ip_ufo_append_data()
850 __skb_queue_tail(queue, skb); in ip_ufo_append_data()
851 } else if (skb_is_gso(skb)) { in ip_ufo_append_data()
855 skb->ip_summed = CHECKSUM_PARTIAL; in ip_ufo_append_data()
857 skb_shinfo(skb)->gso_size = maxfraglen - fragheaderlen; in ip_ufo_append_data()
858 skb_shinfo(skb)->gso_type = SKB_GSO_UDP; in ip_ufo_append_data()
861 return skb_append_datato_frags(sk, skb, getfrag, from, in ip_ufo_append_data()
871 int len, int odd, struct sk_buff *skb), in __ip_append_data() argument
876 struct sk_buff *skb; in __ip_append_data() local
890 skb = skb_peek_tail(queue); in __ip_append_data()
892 exthdrlen = !skb ? rt->dst.header_len : 0; in __ip_append_data()
922 if (((length > mtu) || (skb && skb_is_gso(skb))) && in __ip_append_data()
941 if (!skb) in __ip_append_data()
946 copy = mtu - skb->len; in __ip_append_data()
948 copy = maxfraglen - skb->len; in __ip_append_data()
957 skb_prev = skb; in __ip_append_data()
989 skb = sock_alloc_send_skb(sk, in __ip_append_data()
993 skb = NULL; in __ip_append_data()
996 skb = sock_wmalloc(sk, in __ip_append_data()
999 if (unlikely(!skb)) in __ip_append_data()
1002 if (!skb) in __ip_append_data()
1008 skb->ip_summed = csummode; in __ip_append_data()
1009 skb->csum = 0; in __ip_append_data()
1010 skb_reserve(skb, hh_len); in __ip_append_data()
1013 skb_shinfo(skb)->tx_flags = cork->tx_flags; in __ip_append_data()
1015 skb_shinfo(skb)->tskey = tskey; in __ip_append_data()
1021 data = skb_put(skb, fraglen + exthdrlen); in __ip_append_data()
1022 skb_set_network_header(skb, exthdrlen); in __ip_append_data()
1023 skb->transport_header = (skb->network_header + in __ip_append_data()
1028 skb->csum = skb_copy_and_csum_bits( in __ip_append_data()
1032 skb->csum); in __ip_append_data()
1038 if (copy > 0 && getfrag(from, data + transhdrlen, offset, copy, fraggap, skb) < 0) { in __ip_append_data()
1040 kfree_skb(skb); in __ip_append_data()
1053 __skb_queue_tail(queue, skb); in __ip_append_data()
1063 off = skb->len; in __ip_append_data()
1064 if (getfrag(from, skb_put(skb, copy), in __ip_append_data()
1065 offset, copy, off, skb) < 0) { in __ip_append_data()
1066 __skb_trim(skb, off); in __ip_append_data()
1071 int i = skb_shinfo(skb)->nr_frags; in __ip_append_data()
1077 if (!skb_can_coalesce(skb, i, pfrag->page, in __ip_append_data()
1083 __skb_fill_page_desc(skb, i, pfrag->page, in __ip_append_data()
1085 skb_shinfo(skb)->nr_frags = ++i; in __ip_append_data()
1091 offset, copy, skb->len, skb) < 0) in __ip_append_data()
1095 skb_frag_size_add(&skb_shinfo(skb)->frags[i - 1], copy); in __ip_append_data()
1096 skb->len += copy; in __ip_append_data()
1097 skb->data_len += copy; in __ip_append_data()
1098 skb->truesize += copy; in __ip_append_data()
1168 int odd, struct sk_buff *skb), in ip_append_data() argument
1196 struct sk_buff *skb; in ip_append_page() local
1236 skb = skb_peek_tail(&sk->sk_write_queue); in ip_append_page()
1237 if (!skb) in ip_append_page()
1240 if ((size + skb->len > mtu) && in ip_append_page()
1243 if (skb->ip_summed != CHECKSUM_PARTIAL) in ip_append_page()
1246 skb_shinfo(skb)->gso_size = mtu - fragheaderlen; in ip_append_page()
1247 skb_shinfo(skb)->gso_type = SKB_GSO_UDP; in ip_append_page()
1252 if (skb_is_gso(skb)) { in ip_append_page()
1257 len = mtu - skb->len; in ip_append_page()
1259 len = maxfraglen - skb->len; in ip_append_page()
1265 skb_prev = skb; in ip_append_page()
1269 skb = sock_wmalloc(sk, alloclen, 1, sk->sk_allocation); in ip_append_page()
1270 if (unlikely(!skb)) { in ip_append_page()
1278 skb->ip_summed = CHECKSUM_NONE; in ip_append_page()
1279 skb->csum = 0; in ip_append_page()
1280 skb_reserve(skb, hh_len); in ip_append_page()
1285 skb_put(skb, fragheaderlen + fraggap); in ip_append_page()
1286 skb_reset_network_header(skb); in ip_append_page()
1287 skb->transport_header = (skb->network_header + in ip_append_page()
1290 skb->csum = skb_copy_and_csum_bits(skb_prev, in ip_append_page()
1292 skb_transport_header(skb), in ip_append_page()
1295 skb->csum); in ip_append_page()
1302 __skb_queue_tail(&sk->sk_write_queue, skb); in ip_append_page()
1309 if (skb_append_pagefrags(skb, page, offset, len)) { in ip_append_page()
1314 if (skb->ip_summed == CHECKSUM_NONE) { in ip_append_page()
1317 skb->csum = csum_block_add(skb->csum, csum, skb->len); in ip_append_page()
1320 skb->len += len; in ip_append_page()
1321 skb->data_len += len; in ip_append_page()
1322 skb->truesize += len; in ip_append_page()
1353 struct sk_buff *skb, *tmp_skb; in __ip_make_skb() local
1363 skb = __skb_dequeue(queue); in __ip_make_skb()
1364 if (!skb) in __ip_make_skb()
1366 tail_skb = &(skb_shinfo(skb)->frag_list); in __ip_make_skb()
1369 if (skb->data < skb_network_header(skb)) in __ip_make_skb()
1370 __skb_pull(skb, skb_network_offset(skb)); in __ip_make_skb()
1372 __skb_pull(tmp_skb, skb_network_header_len(skb)); in __ip_make_skb()
1375 skb->len += tmp_skb->len; in __ip_make_skb()
1376 skb->data_len += tmp_skb->len; in __ip_make_skb()
1377 skb->truesize += tmp_skb->truesize; in __ip_make_skb()
1386 skb->ignore_df = ip_sk_ignore_df(sk); in __ip_make_skb()
1393 (skb->len <= dst_mtu(&rt->dst) && in __ip_make_skb()
1407 iph = ip_hdr(skb); in __ip_make_skb()
1415 ip_select_ident(net, skb, sk); in __ip_make_skb()
1419 ip_options_build(skb, opt, cork->addr, rt, 0); in __ip_make_skb()
1422 skb->priority = (cork->tos != -1) ? cork->priority: sk->sk_priority; in __ip_make_skb()
1423 skb->mark = sk->sk_mark; in __ip_make_skb()
1429 skb_dst_set(skb, &rt->dst); in __ip_make_skb()
1433 skb_transport_header(skb))->type); in __ip_make_skb()
1437 return skb; in __ip_make_skb()
1440 int ip_send_skb(struct net *net, struct sk_buff *skb) in ip_send_skb() argument
1444 err = ip_local_out(net, skb->sk, skb); in ip_send_skb()
1457 struct sk_buff *skb; in ip_push_pending_frames() local
1459 skb = ip_finish_skb(sk, fl4); in ip_push_pending_frames()
1460 if (!skb) in ip_push_pending_frames()
1464 return ip_send_skb(sock_net(sk), skb); in ip_push_pending_frames()
1474 struct sk_buff *skb; in __ip_flush_pending_frames() local
1476 while ((skb = __skb_dequeue_tail(queue)) != NULL) in __ip_flush_pending_frames()
1477 kfree_skb(skb); in __ip_flush_pending_frames()
1490 int len, int odd, struct sk_buff *skb), in ip_make_skb() argument
1526 int len, int odd, struct sk_buff *skb) in ip_reply_glue_bits() argument
1531 skb->csum = csum_block_add(skb->csum, csum, odd); in ip_reply_glue_bits()
1539 void ip_send_unicast_reply(struct sock *sk, struct sk_buff *skb, in ip_send_unicast_reply() argument
1548 struct rtable *rt = skb_rtable(skb); in ip_send_unicast_reply()
1554 if (__ip_options_echo(&replyopts.opt.opt, skb, sopt)) in ip_send_unicast_reply()
1571 if (!oif && netif_index_is_l3_master(net, skb->skb_iif)) in ip_send_unicast_reply()
1572 oif = skb->skb_iif; in ip_send_unicast_reply()
1575 IP4_REPLY_MARK(net, skb->mark), in ip_send_unicast_reply()
1577 RT_SCOPE_UNIVERSE, ip_hdr(skb)->protocol, in ip_send_unicast_reply()
1580 tcp_hdr(skb)->source, tcp_hdr(skb)->dest); in ip_send_unicast_reply()
1581 security_skb_classify_flow(skb, flowi4_to_flowi(&fl4)); in ip_send_unicast_reply()
1588 sk->sk_priority = skb->priority; in ip_send_unicast_reply()
1589 sk->sk_protocol = ip_hdr(skb)->protocol; in ip_send_unicast_reply()