net/core/datagram.c
Source file repositories/reference/linux-study-clean/net/core/datagram.c
File Facts
- System
- Linux kernel
- Corpus path
net/core/datagram.c- Extension
.c- Size
- 25517 bytes
- Lines
- 1006
- Domain
- Networking Core
- Bucket
- Sockets, Protocols, Packet Path, And Network Policy
- Inferred role
- Networking Core: exported/initcall integration point
- Status
- integration implementation candidate
Why This File Exists
Networking stack implementation surface: socket APIs, protocol dispatch, packet flow, routing, filtering, and network namespaces.
- Networking stack implementation surface: socket APIs, protocol dispatch, packet flow, routing, filtering, and network namespaces.
- Exports symbols or registers init work; inspect boot/module ordering and who consumes the exported contract.
- Touches user memory; correctness depends on fault-safe copying and privilege boundary handling.
- Uses kernel synchronization; read lock ordering, sleepability, and interrupt context assumptions before translating.
- Defines or uses C structs; map object ownership, embedded links, reference counts, and lock ownership.
Dependency Surface
linux/module.hlinux/types.hlinux/kernel.hlinux/uaccess.hlinux/mm.hlinux/interrupt.hlinux/errno.hlinux/sched.hlinux/inet.hlinux/netdevice.hlinux/rtnetlink.hlinux/poll.hlinux/highmem.hlinux/spinlock.hlinux/slab.hlinux/pagemap.hlinux/iov_iter.hlinux/indirect_call_wrapper.hlinux/crc32.hnet/protocol.hlinux/skbuff.hnet/checksum.hnet/sock.hnet/tcp_states.htrace/events/skb.hnet/busy_poll.hdevmem.h
Detected Declarations
struct csum_statefunction recvmsgfunction receiver_wake_functionfunction __skb_wait_for_more_packetsfunction skb_free_datagramfunction __sk_queue_drop_skbfunction skb_kill_datagramfunction __skb_datagram_iterfunction skb_frag_foreach_pagefunction skb_walk_fragsfunction crc32c_and_copy_to_iterfunction skb_copy_and_crc32c_datagram_iterfunction simple_copy_to_iterfunction skb_copy_datagram_iterfunction skb_copy_datagram_from_iterfunction skb_walk_fragsfunction skb_copy_datagram_from_iter_fullfunction zerocopy_fill_skb_from_iterfunction zerocopy_fill_skb_from_devmemfunction __zerocopy_sg_from_iterfunction zerocopy_sg_from_iterfunction copy_to_user_iter_csumfunction memcpy_to_iter_csumfunction csum_and_copy_to_iterfunction skb_copy_and_csum_datagramfunction skb_copy_and_csum_datagram_msgfunction datagram_poll_queuefunction sock_writeableexport __skb_wait_for_more_packetsexport __skb_try_recv_datagramexport __skb_recv_datagramexport skb_recv_datagramexport skb_free_datagramexport __sk_queue_drop_skbexport skb_kill_datagramexport skb_copy_and_crc32c_datagram_iterexport skb_copy_datagram_iterexport skb_copy_datagram_from_iterexport skb_copy_datagram_from_iter_fullexport __zerocopy_sg_from_iterexport zerocopy_sg_from_iterexport skb_copy_and_csum_datagram_msgexport datagram_poll_queueexport datagram_poll
Annotated Snippet
struct csum_state {
__wsum csum;
size_t off;
};
static size_t csum_and_copy_to_iter(const void *addr, size_t bytes, void *_csstate,
struct iov_iter *i)
{
struct csum_state *csstate = _csstate;
__wsum sum;
if (WARN_ON_ONCE(i->data_source))
return 0;
if (unlikely(iov_iter_is_discard(i))) {
// can't use csum_memcpy() for that one - data is not copied
csstate->csum = csum_block_add(csstate->csum,
csum_partial(addr, bytes, 0),
csstate->off);
csstate->off += bytes;
return bytes;
}
sum = csum_shift(csstate->csum, csstate->off);
bytes = iterate_and_advance2(i, bytes, (void *)addr, &sum,
copy_to_user_iter_csum,
memcpy_to_iter_csum);
csstate->csum = csum_shift(sum, csstate->off);
csstate->off += bytes;
return bytes;
}
/**
* skb_copy_and_csum_datagram - Copy datagram to an iovec iterator
* and update a checksum.
* @skb: buffer to copy
* @offset: offset in the buffer to start copying from
* @to: iovec iterator to copy to
* @len: amount of data to copy from buffer to iovec
* @csump: checksum pointer
*/
static int skb_copy_and_csum_datagram(const struct sk_buff *skb, int offset,
struct iov_iter *to, int len,
__wsum *csump)
{
struct csum_state csdata = { .csum = *csump };
int ret;
ret = __skb_datagram_iter(skb, offset, to, len, true,
csum_and_copy_to_iter, &csdata);
if (ret)
return ret;
*csump = csdata.csum;
return 0;
}
/**
* skb_copy_and_csum_datagram_msg - Copy and checksum skb to user iovec.
* @skb: skbuff
* @hlen: hardware length
* @msg: destination
*
* Caller _must_ check that skb will fit to this iovec.
*
* Returns: 0 - success.
* -EINVAL - checksum failure.
* -EFAULT - fault during copy.
*/
int skb_copy_and_csum_datagram_msg(struct sk_buff *skb,
int hlen, struct msghdr *msg)
{
__wsum csum;
int chunk = skb->len - hlen;
if (!chunk)
return 0;
if (msg_data_left(msg) < chunk) {
if (__skb_checksum_complete(skb))
return -EINVAL;
if (skb_copy_datagram_msg(skb, hlen, msg, chunk))
goto fault;
} else {
csum = csum_partial(skb->data, hlen, skb->csum);
if (skb_copy_and_csum_datagram(skb, hlen, &msg->msg_iter,
chunk, &csum))
goto fault;
if (csum_fold(csum)) {
Annotation
- Immediate include surface: `linux/module.h`, `linux/types.h`, `linux/kernel.h`, `linux/uaccess.h`, `linux/mm.h`, `linux/interrupt.h`, `linux/errno.h`, `linux/sched.h`.
- Detected declarations: `struct csum_state`, `function recvmsg`, `function receiver_wake_function`, `function __skb_wait_for_more_packets`, `function skb_free_datagram`, `function __sk_queue_drop_skb`, `function skb_kill_datagram`, `function __skb_datagram_iter`, `function skb_frag_foreach_page`, `function skb_walk_frags`.
- Atlas domain: Networking Core / Sockets, Protocols, Packet Path, And Network Policy.
- Implementation status: integration implementation candidate.
- This snippet crosses the user/kernel memory boundary; validate fault handling and access checks before translating the pattern.
- Synchronization appears in or near this file; preserve lock ordering, sleepability, and interrupt-context constraints.
Implementation Notes
- This generated page is the file-by-file coverage layer; curated subsystem chapters should link here when they synthesize a multi-file control flow.
- Core OS pages should be promoted from atlas-only to deep-reviewed when they explain data structures, invariants, locking, lifecycle, and C implementation snippets.
- Driver-family pages are intentionally pattern-oriented unless they are part of the selected PCIe/NVMe representative device path.