Lines Matching refs:skb

94 int __ip_local_out_sk(struct sock *sk, struct sk_buff *skb)  in __ip_local_out_sk()  argument
96 struct iphdr *iph = ip_hdr(skb); in __ip_local_out_sk()
98 iph->tot_len = htons(skb->len); in __ip_local_out_sk()
100 return nf_hook(NFPROTO_IPV4, NF_INET_LOCAL_OUT, sk, skb, NULL, in __ip_local_out_sk()
101 skb_dst(skb)->dev, dst_output_sk); in __ip_local_out_sk()
104 int __ip_local_out(struct sk_buff *skb) in __ip_local_out() argument
106 return __ip_local_out_sk(skb->sk, skb); in __ip_local_out()
109 int ip_local_out_sk(struct sock *sk, struct sk_buff *skb) in ip_local_out_sk() argument
113 err = __ip_local_out(skb); in ip_local_out_sk()
115 err = dst_output_sk(sk, skb); in ip_local_out_sk()
134 int ip_build_and_send_pkt(struct sk_buff *skb, struct sock *sk, in ip_build_and_send_pkt() argument
138 struct rtable *rt = skb_rtable(skb); in ip_build_and_send_pkt()
142 skb_push(skb, sizeof(struct iphdr) + (opt ? opt->opt.optlen : 0)); in ip_build_and_send_pkt()
143 skb_reset_network_header(skb); in ip_build_and_send_pkt()
144 iph = ip_hdr(skb); in ip_build_and_send_pkt()
156 ip_select_ident(sock_net(sk), skb, sk); in ip_build_and_send_pkt()
160 ip_options_build(skb, &opt->opt, daddr, rt, 0); in ip_build_and_send_pkt()
163 skb->priority = sk->sk_priority; in ip_build_and_send_pkt()
164 skb->mark = sk->sk_mark; in ip_build_and_send_pkt()
167 return ip_local_out(skb); in ip_build_and_send_pkt()
171 static inline int ip_finish_output2(struct sock *sk, struct sk_buff *skb) in ip_finish_output2() argument
173 struct dst_entry *dst = skb_dst(skb); in ip_finish_output2()
181 IP_UPD_PO_STATS(dev_net(dev), IPSTATS_MIB_OUTMCAST, skb->len); in ip_finish_output2()
183 IP_UPD_PO_STATS(dev_net(dev), IPSTATS_MIB_OUTBCAST, skb->len); in ip_finish_output2()
186 if (unlikely(skb_headroom(skb) < hh_len && dev->header_ops)) { in ip_finish_output2()
189 skb2 = skb_realloc_headroom(skb, LL_RESERVED_SPACE(dev)); in ip_finish_output2()
191 kfree_skb(skb); in ip_finish_output2()
194 if (skb->sk) in ip_finish_output2()
195 skb_set_owner_w(skb2, skb->sk); in ip_finish_output2()
196 consume_skb(skb); in ip_finish_output2()
197 skb = skb2; in ip_finish_output2()
201 nexthop = (__force u32) rt_nexthop(rt, ip_hdr(skb)->daddr); in ip_finish_output2()
206 int res = dst_neigh_output(dst, neigh, skb); in ip_finish_output2()
215 kfree_skb(skb); in ip_finish_output2()
219 static int ip_finish_output_gso(struct sock *sk, struct sk_buff *skb) in ip_finish_output_gso() argument
226 if (((IPCB(skb)->flags & IPSKB_FORWARDED) == 0) || in ip_finish_output_gso()
227 skb_gso_network_seglen(skb) <= ip_skb_dst_mtu(skb)) in ip_finish_output_gso()
228 return ip_finish_output2(sk, skb); in ip_finish_output_gso()
237 features = netif_skb_features(skb); in ip_finish_output_gso()
238 BUILD_BUG_ON(sizeof(*IPCB(skb)) > SKB_SGO_CB_OFFSET); in ip_finish_output_gso()
239 segs = skb_gso_segment(skb, features & ~NETIF_F_GSO_MASK); in ip_finish_output_gso()
241 kfree_skb(skb); in ip_finish_output_gso()
245 consume_skb(skb); in ip_finish_output_gso()
262 static int ip_finish_output(struct sock *sk, struct sk_buff *skb) in ip_finish_output() argument
266 if (skb_dst(skb)->xfrm) { in ip_finish_output()
267 IPCB(skb)->flags |= IPSKB_REROUTED; in ip_finish_output()
268 return dst_output_sk(sk, skb); in ip_finish_output()
271 if (skb_is_gso(skb)) in ip_finish_output()
272 return ip_finish_output_gso(sk, skb); in ip_finish_output()
274 if (skb->len > ip_skb_dst_mtu(skb)) in ip_finish_output()
275 return ip_fragment(sk, skb, ip_finish_output2); in ip_finish_output()
277 return ip_finish_output2(sk, skb); in ip_finish_output()
280 int ip_mc_output(struct sock *sk, struct sk_buff *skb) in ip_mc_output() argument
282 struct rtable *rt = skb_rtable(skb); in ip_mc_output()
288 IP_UPD_PO_STATS(dev_net(dev), IPSTATS_MIB_OUT, skb->len); in ip_mc_output()
290 skb->dev = dev; in ip_mc_output()
291 skb->protocol = htons(ETH_P_IP); in ip_mc_output()
310 !(IPCB(skb)->flags & IPSKB_FORWARDED)) in ip_mc_output()
313 struct sk_buff *newskb = skb_clone(skb, GFP_ATOMIC); in ip_mc_output()
322 if (ip_hdr(skb)->ttl == 0) { in ip_mc_output()
323 kfree_skb(skb); in ip_mc_output()
329 struct sk_buff *newskb = skb_clone(skb, GFP_ATOMIC); in ip_mc_output()
335 return NF_HOOK_COND(NFPROTO_IPV4, NF_INET_POST_ROUTING, sk, skb, NULL, in ip_mc_output()
336 skb->dev, ip_finish_output, in ip_mc_output()
337 !(IPCB(skb)->flags & IPSKB_REROUTED)); in ip_mc_output()
340 int ip_output(struct sock *sk, struct sk_buff *skb) in ip_output() argument
342 struct net_device *dev = skb_dst(skb)->dev; in ip_output()
344 IP_UPD_PO_STATS(dev_net(dev), IPSTATS_MIB_OUT, skb->len); in ip_output()
346 skb->dev = dev; in ip_output()
347 skb->protocol = htons(ETH_P_IP); in ip_output()
349 return NF_HOOK_COND(NFPROTO_IPV4, NF_INET_POST_ROUTING, sk, skb, in ip_output()
352 !(IPCB(skb)->flags & IPSKB_REROUTED)); in ip_output()
370 int ip_queue_xmit(struct sock *sk, struct sk_buff *skb, struct flowi *fl) in ip_queue_xmit() argument
385 rt = skb_rtable(skb); in ip_queue_xmit()
414 skb_dst_set_noref(skb, &rt->dst); in ip_queue_xmit()
421 skb_push(skb, sizeof(struct iphdr) + (inet_opt ? inet_opt->opt.optlen : 0)); in ip_queue_xmit()
422 skb_reset_network_header(skb); in ip_queue_xmit()
423 iph = ip_hdr(skb); in ip_queue_xmit()
425 if (ip_dont_fragment(sk, &rt->dst) && !skb->ignore_df) in ip_queue_xmit()
437 ip_options_build(skb, &inet_opt->opt, inet->inet_daddr, rt, 0); in ip_queue_xmit()
440 ip_select_ident_segs(sock_net(sk), skb, sk, in ip_queue_xmit()
441 skb_shinfo(skb)->gso_segs ?: 1); in ip_queue_xmit()
444 skb->priority = sk->sk_priority; in ip_queue_xmit()
445 skb->mark = sk->sk_mark; in ip_queue_xmit()
447 res = ip_local_out(skb); in ip_queue_xmit()
454 kfree_skb(skb); in ip_queue_xmit()
489 int ip_fragment(struct sock *sk, struct sk_buff *skb, in ip_fragment() argument
499 struct rtable *rt = skb_rtable(skb); in ip_fragment()
508 iph = ip_hdr(skb); in ip_fragment()
510 mtu = ip_skb_dst_mtu(skb); in ip_fragment()
511 if (unlikely(((iph->frag_off & htons(IP_DF)) && !skb->ignore_df) || in ip_fragment()
512 (IPCB(skb)->frag_max_size && in ip_fragment()
513 IPCB(skb)->frag_max_size > mtu))) { in ip_fragment()
515 icmp_send(skb, ICMP_DEST_UNREACH, ICMP_FRAG_NEEDED, in ip_fragment()
517 kfree_skb(skb); in ip_fragment()
528 if (skb->nf_bridge) in ip_fragment()
529 mtu -= nf_bridge_mtu_reduction(skb); in ip_fragment()
531 IPCB(skb)->flags |= IPSKB_FRAG_COMPLETE; in ip_fragment()
540 if (skb_has_frag_list(skb)) { in ip_fragment()
542 int first_len = skb_pagelen(skb); in ip_fragment()
547 skb_cloned(skb)) in ip_fragment()
550 skb_walk_frags(skb, frag) { in ip_fragment()
562 if (skb->sk) { in ip_fragment()
563 frag->sk = skb->sk; in ip_fragment()
566 skb->truesize -= frag->truesize; in ip_fragment()
573 frag = skb_shinfo(skb)->frag_list; in ip_fragment()
574 skb_frag_list_init(skb); in ip_fragment()
575 skb->data_len = first_len - skb_headlen(skb); in ip_fragment()
576 skb->len = first_len; in ip_fragment()
592 ip_copy_metadata(frag, skb); in ip_fragment()
595 offset += skb->len - hlen; in ip_fragment()
603 err = output(sk, skb); in ip_fragment()
610 skb = frag; in ip_fragment()
611 frag = skb->next; in ip_fragment()
612 skb->next = NULL; in ip_fragment()
621 skb = frag->next; in ip_fragment()
623 frag = skb; in ip_fragment()
629 skb_walk_frags(skb, frag2) { in ip_fragment()
634 skb->truesize += frag2->truesize; in ip_fragment()
640 if ((skb->ip_summed == CHECKSUM_PARTIAL) && skb_checksum_help(skb)) in ip_fragment()
642 iph = ip_hdr(skb); in ip_fragment()
644 left = skb->len - hlen; /* Space per frame */ in ip_fragment()
682 ip_copy_metadata(skb2, skb); in ip_fragment()
693 if (skb->sk) in ip_fragment()
694 skb_set_owner_w(skb2, skb->sk); in ip_fragment()
700 skb_copy_from_linear_data(skb, skb_network_header(skb2), hlen); in ip_fragment()
705 if (skb_copy_bits(skb, ptr, skb_transport_header(skb2), len)) in ip_fragment()
722 ip_options_fragment(skb); in ip_fragment()
746 consume_skb(skb); in ip_fragment()
751 kfree_skb(skb); in ip_fragment()
758 ip_generic_getfrag(void *from, char *to, int offset, int len, int odd, struct sk_buff *skb) in ip_generic_getfrag() argument
762 if (skb->ip_summed == CHECKSUM_PARTIAL) { in ip_generic_getfrag()
769 skb->csum = csum_block_add(skb->csum, csum, odd); in ip_generic_getfrag()
789 int odd, struct sk_buff *skb), in ip_ufo_append_data() argument
793 struct sk_buff *skb; in ip_ufo_append_data() local
800 skb = skb_peek_tail(queue); in ip_ufo_append_data()
801 if (!skb) { in ip_ufo_append_data()
802 skb = sock_alloc_send_skb(sk, in ip_ufo_append_data()
806 if (!skb) in ip_ufo_append_data()
810 skb_reserve(skb, hh_len); in ip_ufo_append_data()
813 skb_put(skb, fragheaderlen + transhdrlen); in ip_ufo_append_data()
816 skb_reset_network_header(skb); in ip_ufo_append_data()
819 skb->transport_header = skb->network_header + fragheaderlen; in ip_ufo_append_data()
821 skb->csum = 0; in ip_ufo_append_data()
823 __skb_queue_tail(queue, skb); in ip_ufo_append_data()
824 } else if (skb_is_gso(skb)) { in ip_ufo_append_data()
828 skb->ip_summed = CHECKSUM_PARTIAL; in ip_ufo_append_data()
830 skb_shinfo(skb)->gso_size = maxfraglen - fragheaderlen; in ip_ufo_append_data()
831 skb_shinfo(skb)->gso_type = SKB_GSO_UDP; in ip_ufo_append_data()
834 return skb_append_datato_frags(sk, skb, getfrag, from, in ip_ufo_append_data()
844 int len, int odd, struct sk_buff *skb), in __ip_append_data() argument
849 struct sk_buff *skb; in __ip_append_data() local
863 skb = skb_peek_tail(queue); in __ip_append_data()
865 exthdrlen = !skb ? rt->dst.header_len : 0; in __ip_append_data()
894 if (((length > mtu) || (skb && skb_is_gso(skb))) && in __ip_append_data()
913 if (!skb) in __ip_append_data()
918 copy = mtu - skb->len; in __ip_append_data()
920 copy = maxfraglen - skb->len; in __ip_append_data()
929 skb_prev = skb; in __ip_append_data()
961 skb = sock_alloc_send_skb(sk, in __ip_append_data()
965 skb = NULL; in __ip_append_data()
968 skb = sock_wmalloc(sk, in __ip_append_data()
971 if (unlikely(!skb)) in __ip_append_data()
974 if (!skb) in __ip_append_data()
980 skb->ip_summed = csummode; in __ip_append_data()
981 skb->csum = 0; in __ip_append_data()
982 skb_reserve(skb, hh_len); in __ip_append_data()
985 skb_shinfo(skb)->tx_flags = cork->tx_flags; in __ip_append_data()
987 skb_shinfo(skb)->tskey = tskey; in __ip_append_data()
993 data = skb_put(skb, fraglen + exthdrlen); in __ip_append_data()
994 skb_set_network_header(skb, exthdrlen); in __ip_append_data()
995 skb->transport_header = (skb->network_header + in __ip_append_data()
1000 skb->csum = skb_copy_and_csum_bits( in __ip_append_data()
1004 skb->csum); in __ip_append_data()
1010 if (copy > 0 && getfrag(from, data + transhdrlen, offset, copy, fraggap, skb) < 0) { in __ip_append_data()
1012 kfree_skb(skb); in __ip_append_data()
1025 __skb_queue_tail(queue, skb); in __ip_append_data()
1035 off = skb->len; in __ip_append_data()
1036 if (getfrag(from, skb_put(skb, copy), in __ip_append_data()
1037 offset, copy, off, skb) < 0) { in __ip_append_data()
1038 __skb_trim(skb, off); in __ip_append_data()
1043 int i = skb_shinfo(skb)->nr_frags; in __ip_append_data()
1049 if (!skb_can_coalesce(skb, i, pfrag->page, in __ip_append_data()
1055 __skb_fill_page_desc(skb, i, pfrag->page, in __ip_append_data()
1057 skb_shinfo(skb)->nr_frags = ++i; in __ip_append_data()
1063 offset, copy, skb->len, skb) < 0) in __ip_append_data()
1067 skb_frag_size_add(&skb_shinfo(skb)->frags[i - 1], copy); in __ip_append_data()
1068 skb->len += copy; in __ip_append_data()
1069 skb->data_len += copy; in __ip_append_data()
1070 skb->truesize += copy; in __ip_append_data()
1140 int odd, struct sk_buff *skb), in ip_append_data() argument
1168 struct sk_buff *skb; in ip_append_page() local
1208 skb = skb_peek_tail(&sk->sk_write_queue); in ip_append_page()
1209 if (!skb) in ip_append_page()
1213 if ((size + skb->len > mtu) && in ip_append_page()
1216 skb_shinfo(skb)->gso_size = mtu - fragheaderlen; in ip_append_page()
1217 skb_shinfo(skb)->gso_type = SKB_GSO_UDP; in ip_append_page()
1223 if (skb_is_gso(skb)) in ip_append_page()
1228 len = mtu - skb->len; in ip_append_page()
1230 len = maxfraglen - skb->len; in ip_append_page()
1236 skb_prev = skb; in ip_append_page()
1240 skb = sock_wmalloc(sk, alloclen, 1, sk->sk_allocation); in ip_append_page()
1241 if (unlikely(!skb)) { in ip_append_page()
1249 skb->ip_summed = CHECKSUM_NONE; in ip_append_page()
1250 skb->csum = 0; in ip_append_page()
1251 skb_reserve(skb, hh_len); in ip_append_page()
1256 skb_put(skb, fragheaderlen + fraggap); in ip_append_page()
1257 skb_reset_network_header(skb); in ip_append_page()
1258 skb->transport_header = (skb->network_header + in ip_append_page()
1261 skb->csum = skb_copy_and_csum_bits(skb_prev, in ip_append_page()
1263 skb_transport_header(skb), in ip_append_page()
1266 skb->csum); in ip_append_page()
1273 __skb_queue_tail(&sk->sk_write_queue, skb); in ip_append_page()
1277 i = skb_shinfo(skb)->nr_frags; in ip_append_page()
1280 if (skb_can_coalesce(skb, i, page, offset)) { in ip_append_page()
1281 skb_frag_size_add(&skb_shinfo(skb)->frags[i-1], len); in ip_append_page()
1284 skb_fill_page_desc(skb, i, page, offset, len); in ip_append_page()
1290 if (skb->ip_summed == CHECKSUM_NONE) { in ip_append_page()
1293 skb->csum = csum_block_add(skb->csum, csum, skb->len); in ip_append_page()
1296 skb->len += len; in ip_append_page()
1297 skb->data_len += len; in ip_append_page()
1298 skb->truesize += len; in ip_append_page()
1329 struct sk_buff *skb, *tmp_skb; in __ip_make_skb() local
1339 skb = __skb_dequeue(queue); in __ip_make_skb()
1340 if (!skb) in __ip_make_skb()
1342 tail_skb = &(skb_shinfo(skb)->frag_list); in __ip_make_skb()
1345 if (skb->data < skb_network_header(skb)) in __ip_make_skb()
1346 __skb_pull(skb, skb_network_offset(skb)); in __ip_make_skb()
1348 __skb_pull(tmp_skb, skb_network_header_len(skb)); in __ip_make_skb()
1351 skb->len += tmp_skb->len; in __ip_make_skb()
1352 skb->data_len += tmp_skb->len; in __ip_make_skb()
1353 skb->truesize += tmp_skb->truesize; in __ip_make_skb()
1362 skb->ignore_df = ip_sk_ignore_df(sk); in __ip_make_skb()
1369 (skb->len <= dst_mtu(&rt->dst) && in __ip_make_skb()
1383 iph = ip_hdr(skb); in __ip_make_skb()
1391 ip_select_ident(net, skb, sk); in __ip_make_skb()
1395 ip_options_build(skb, opt, cork->addr, rt, 0); in __ip_make_skb()
1398 skb->priority = (cork->tos != -1) ? cork->priority: sk->sk_priority; in __ip_make_skb()
1399 skb->mark = sk->sk_mark; in __ip_make_skb()
1405 skb_dst_set(skb, &rt->dst); in __ip_make_skb()
1409 skb_transport_header(skb))->type); in __ip_make_skb()
1413 return skb; in __ip_make_skb()
1416 int ip_send_skb(struct net *net, struct sk_buff *skb) in ip_send_skb() argument
1420 err = ip_local_out(skb); in ip_send_skb()
1433 struct sk_buff *skb; in ip_push_pending_frames() local
1435 skb = ip_finish_skb(sk, fl4); in ip_push_pending_frames()
1436 if (!skb) in ip_push_pending_frames()
1440 return ip_send_skb(sock_net(sk), skb); in ip_push_pending_frames()
1450 struct sk_buff *skb; in __ip_flush_pending_frames() local
1452 while ((skb = __skb_dequeue_tail(queue)) != NULL) in __ip_flush_pending_frames()
1453 kfree_skb(skb); in __ip_flush_pending_frames()
1466 int len, int odd, struct sk_buff *skb), in ip_make_skb() argument
1502 int len, int odd, struct sk_buff *skb) in ip_reply_glue_bits() argument
1507 skb->csum = csum_block_add(skb->csum, csum, odd); in ip_reply_glue_bits()
1515 void ip_send_unicast_reply(struct sock *sk, struct sk_buff *skb, in ip_send_unicast_reply() argument
1524 struct rtable *rt = skb_rtable(skb); in ip_send_unicast_reply()
1529 if (__ip_options_echo(&replyopts.opt.opt, skb, sopt)) in ip_send_unicast_reply()
1546 IP4_REPLY_MARK(net, skb->mark), in ip_send_unicast_reply()
1548 RT_SCOPE_UNIVERSE, ip_hdr(skb)->protocol, in ip_send_unicast_reply()
1551 tcp_hdr(skb)->source, tcp_hdr(skb)->dest); in ip_send_unicast_reply()
1552 security_skb_classify_flow(skb, flowi4_to_flowi(&fl4)); in ip_send_unicast_reply()
1559 sk->sk_priority = skb->priority; in ip_send_unicast_reply()
1560 sk->sk_protocol = ip_hdr(skb)->protocol; in ip_send_unicast_reply()
1577 skb_set_queue_mapping(nskb, skb_get_queue_mapping(skb)); in ip_send_unicast_reply()