net/mptcp/sockopt.c
Source file repositories/reference/linux-study-clean/net/mptcp/sockopt.c
File Facts
- System
- Linux kernel
- Corpus path
net/mptcp/sockopt.c- Extension
.c- Size
- 42409 bytes
- Lines
- 1670
- 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.
- Defines or uses C structs; map object ownership, embedded links, reference counts, and lock ownership.
Dependency Surface
linux/kernel.hlinux/module.hnet/sock.hnet/protocol.hnet/tcp.hnet/mptcp.hprotocol.h
Detected Declarations
function Copyrightfunction sockopt_seq_resetfunction sockopt_seq_incfunction mptcp_get_int_optionfunction __mptcp_subflow_set_rcvbuffunction mptcp_sol_socket_sync_intvalfunction mptcp_for_each_subflowfunction mptcp_sol_socket_intvalfunction mptcp_so_incoming_cpufunction mptcp_setsockopt_sol_socket_tstampfunction mptcp_setsockopt_sol_socket_intfunction mptcp_setsockopt_sol_socket_timestampingfunction mptcp_for_each_subflowfunction mptcp_setsockopt_sol_socket_lingerfunction mptcp_setsockopt_sol_socketfunction mptcp_setsockopt_v6function mptcp_supported_sockoptfunction mptcp_setsockopt_sol_tcp_congestionfunction __mptcp_setsockopt_set_valfunction mptcp_for_each_subflowfunction __mptcp_setsockopt_sol_tcp_corkfunction __mptcp_setsockopt_sol_tcp_nodelayfunction mptcp_setsockopt_sol_ip_setfunction mptcp_setsockopt_v4_set_tosfunction mptcp_setsockopt_v4function mptcp_setsockopt_first_sf_onlyfunction mptcp_setsockopt_all_sffunction mptcp_for_each_subflowfunction mptcp_setsockopt_sol_tcpfunction mptcp_setsockoptfunction mptcp_getsockopt_first_sf_onlyfunction mptcp_diag_fill_infofunction mptcp_getsockopt_infofunction mptcp_put_subflow_datafunction mptcp_get_subflow_datafunction mptcp_getsockopt_tcpinfofunction mptcp_for_each_subflowfunction mptcp_get_sub_addrsfunction mptcp_getsockopt_subflow_addrsfunction mptcp_for_each_subflowfunction mptcp_get_full_infofunction mptcp_put_full_infofunction mptcp_getsockopt_full_infofunction mptcp_put_int_optionfunction mptcp_getsockopt_sol_tcpfunction mptcp_getsockopt_v4function mptcp_getsockopt_v6function mptcp_getsockopt_sol_mptcp
Annotated Snippet
switch (optname) {
case SO_DEBUG:
sock_valbool_flag(ssk, SOCK_DBG, !!val);
break;
case SO_KEEPALIVE:
if (ssk->sk_prot->keepalive)
ssk->sk_prot->keepalive(ssk, !!val);
sock_valbool_flag(ssk, SOCK_KEEPOPEN, !!val);
break;
case SO_PRIORITY:
WRITE_ONCE(ssk->sk_priority, val);
break;
case SO_SNDBUF:
case SO_SNDBUFFORCE:
ssk->sk_userlocks |= SOCK_SNDBUF_LOCK;
WRITE_ONCE(ssk->sk_sndbuf, sk->sk_sndbuf);
mptcp_subflow_ctx(ssk)->cached_sndbuf = sk->sk_sndbuf;
break;
case SO_RCVBUF:
case SO_RCVBUFFORCE:
ssk->sk_userlocks |= SOCK_RCVBUF_LOCK;
__mptcp_subflow_set_rcvbuf(ssk, sk->sk_rcvbuf);
break;
case SO_MARK:
if (READ_ONCE(ssk->sk_mark) != sk->sk_mark) {
WRITE_ONCE(ssk->sk_mark, sk->sk_mark);
sk_dst_reset(ssk);
}
break;
case SO_INCOMING_CPU:
WRITE_ONCE(ssk->sk_incoming_cpu, val);
break;
}
subflow->setsockopt_seq = msk->setsockopt_seq;
unlock_sock_fast(ssk, slow);
}
release_sock(sk);
}
static int mptcp_sol_socket_intval(struct mptcp_sock *msk, int optname, int val)
{
sockptr_t optval = KERNEL_SOCKPTR(&val);
struct sock *sk = (struct sock *)msk;
int ret;
ret = sock_setsockopt(sk->sk_socket, SOL_SOCKET, optname,
optval, sizeof(val));
if (ret)
return ret;
mptcp_sol_socket_sync_intval(msk, optname, val);
return 0;
}
static void mptcp_so_incoming_cpu(struct mptcp_sock *msk, int val)
{
struct sock *sk = (struct sock *)msk;
WRITE_ONCE(sk->sk_incoming_cpu, val);
mptcp_sol_socket_sync_intval(msk, SO_INCOMING_CPU, val);
}
static int mptcp_setsockopt_sol_socket_tstamp(struct mptcp_sock *msk, int optname, int val)
{
sockptr_t optval = KERNEL_SOCKPTR(&val);
struct mptcp_subflow_context *subflow;
struct sock *sk = (struct sock *)msk;
int ret;
ret = sock_setsockopt(sk->sk_socket, SOL_SOCKET, optname,
optval, sizeof(val));
if (ret)
return ret;
lock_sock(sk);
mptcp_for_each_subflow(msk, subflow) {
struct sock *ssk = mptcp_subflow_tcp_sock(subflow);
lock_sock(ssk);
sock_set_timestamp(ssk, optname, !!val);
release_sock(ssk);
}
release_sock(sk);
return 0;
}
Annotation
- Immediate include surface: `linux/kernel.h`, `linux/module.h`, `net/sock.h`, `net/protocol.h`, `net/tcp.h`, `net/mptcp.h`, `protocol.h`.
- Detected declarations: `function Copyright`, `function sockopt_seq_reset`, `function sockopt_seq_inc`, `function mptcp_get_int_option`, `function __mptcp_subflow_set_rcvbuf`, `function mptcp_sol_socket_sync_intval`, `function mptcp_for_each_subflow`, `function mptcp_sol_socket_intval`, `function mptcp_so_incoming_cpu`, `function mptcp_setsockopt_sol_socket_tstamp`.
- 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.
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.