diff options
| -rw-r--r-- | include/linux/skbuff.h | 2 | ||||
| -rw-r--r-- | net/core/datagram.c | 84 |
2 files changed, 0 insertions, 86 deletions
diff --git a/include/linux/skbuff.h b/include/linux/skbuff.h index 4902f2df90c8..ab0bc43c82a4 100644 --- a/include/linux/skbuff.h +++ b/include/linux/skbuff.h | |||
| @@ -2644,8 +2644,6 @@ struct sk_buff *skb_recv_datagram(struct sock *sk, unsigned flags, int noblock, | |||
| 2644 | int *err); | 2644 | int *err); |
| 2645 | unsigned int datagram_poll(struct file *file, struct socket *sock, | 2645 | unsigned int datagram_poll(struct file *file, struct socket *sock, |
| 2646 | struct poll_table_struct *wait); | 2646 | struct poll_table_struct *wait); |
| 2647 | int skb_copy_datagram_iovec(const struct sk_buff *from, int offset, | ||
| 2648 | struct iovec *to, int size); | ||
| 2649 | int skb_copy_datagram_iter(const struct sk_buff *from, int offset, | 2647 | int skb_copy_datagram_iter(const struct sk_buff *from, int offset, |
| 2650 | struct iov_iter *to, int size); | 2648 | struct iov_iter *to, int size); |
| 2651 | static inline int skb_copy_datagram_msg(const struct sk_buff *from, int offset, | 2649 | static inline int skb_copy_datagram_msg(const struct sk_buff *from, int offset, |
diff --git a/net/core/datagram.c b/net/core/datagram.c index 41075ed6bb52..df493d68330c 100644 --- a/net/core/datagram.c +++ b/net/core/datagram.c | |||
| @@ -310,90 +310,6 @@ int skb_kill_datagram(struct sock *sk, struct sk_buff *skb, unsigned int flags) | |||
| 310 | EXPORT_SYMBOL(skb_kill_datagram); | 310 | EXPORT_SYMBOL(skb_kill_datagram); |
| 311 | 311 | ||
| 312 | /** | 312 | /** |
| 313 | * skb_copy_datagram_iovec - Copy a datagram to an iovec. | ||
| 314 | * @skb: buffer to copy | ||
| 315 | * @offset: offset in the buffer to start copying from | ||
| 316 | * @to: io vector to copy to | ||
| 317 | * @len: amount of data to copy from buffer to iovec | ||
| 318 | * | ||
| 319 | * Note: the iovec is modified during the copy. | ||
| 320 | */ | ||
| 321 | int skb_copy_datagram_iovec(const struct sk_buff *skb, int offset, | ||
| 322 | struct iovec *to, int len) | ||
| 323 | { | ||
| 324 | int start = skb_headlen(skb); | ||
| 325 | int i, copy = start - offset; | ||
| 326 | struct sk_buff *frag_iter; | ||
| 327 | |||
| 328 | trace_skb_copy_datagram_iovec(skb, len); | ||
| 329 | |||
| 330 | /* Copy header. */ | ||
| 331 | if (copy > 0) { | ||
| 332 | if (copy > len) | ||
| 333 | copy = len; | ||
| 334 | if (memcpy_toiovec(to, skb->data + offset, copy)) | ||
| 335 | goto fault; | ||
| 336 | if ((len -= copy) == 0) | ||
| 337 | return 0; | ||
| 338 | offset += copy; | ||
| 339 | } | ||
| 340 | |||
| 341 | /* Copy paged appendix. Hmm... why does this look so complicated? */ | ||
| 342 | for (i = 0; i < skb_shinfo(skb)->nr_frags; i++) { | ||
| 343 | int end; | ||
| 344 | const skb_frag_t *frag = &skb_shinfo(skb)->frags[i]; | ||
| 345 | |||
| 346 | WARN_ON(start > offset + len); | ||
| 347 | |||
| 348 | end = start + skb_frag_size(frag); | ||
| 349 | if ((copy = end - offset) > 0) { | ||
| 350 | int err; | ||
| 351 | u8 *vaddr; | ||
| 352 | struct page *page = skb_frag_page(frag); | ||
| 353 | |||
| 354 | if (copy > len) | ||
| 355 | copy = len; | ||
| 356 | vaddr = kmap(page); | ||
| 357 | err = memcpy_toiovec(to, vaddr + frag->page_offset + | ||
| 358 | offset - start, copy); | ||
| 359 | kunmap(page); | ||
| 360 | if (err) | ||
| 361 | goto fault; | ||
| 362 | if (!(len -= copy)) | ||
| 363 | return 0; | ||
| 364 | offset += copy; | ||
| 365 | } | ||
| 366 | start = end; | ||
| 367 | } | ||
| 368 | |||
| 369 | skb_walk_frags(skb, frag_iter) { | ||
| 370 | int end; | ||
| 371 | |||
| 372 | WARN_ON(start > offset + len); | ||
| 373 | |||
| 374 | end = start + frag_iter->len; | ||
| 375 | if ((copy = end - offset) > 0) { | ||
| 376 | if (copy > len) | ||
| 377 | copy = len; | ||
| 378 | if (skb_copy_datagram_iovec(frag_iter, | ||
| 379 | offset - start, | ||
| 380 | to, copy)) | ||
| 381 | goto fault; | ||
| 382 | if ((len -= copy) == 0) | ||
| 383 | return 0; | ||
| 384 | offset += copy; | ||
| 385 | } | ||
| 386 | start = end; | ||
| 387 | } | ||
| 388 | if (!len) | ||
| 389 | return 0; | ||
| 390 | |||
| 391 | fault: | ||
| 392 | return -EFAULT; | ||
| 393 | } | ||
| 394 | EXPORT_SYMBOL(skb_copy_datagram_iovec); | ||
| 395 | |||
| 396 | /** | ||
| 397 | * skb_copy_datagram_iter - Copy a datagram to an iovec iterator. | 313 | * skb_copy_datagram_iter - Copy a datagram to an iovec iterator. |
| 398 | * @skb: buffer to copy | 314 | * @skb: buffer to copy |
| 399 | * @offset: offset in the buffer to start copying from | 315 | * @offset: offset in the buffer to start copying from |
