net/mptcp/pm_kernel.c
Source file repositories/reference/linux-study-clean/net/mptcp/pm_kernel.c
File Facts
- System
- Linux kernel
- Corpus path
net/mptcp/pm_kernel.c- Extension
.c- Size
- 44349 bytes
- Lines
- 1656
- 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.
- 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
net/netns/generic.hprotocol.hmib.hmptcp_pm_gen.h
Detected Declarations
struct pm_nl_pernetfunction pm_nl_get_pernet_from_mskfunction mptcp_pm_get_endp_signal_maxfunction mptcp_pm_get_endp_subflow_maxfunction mptcp_pm_get_endp_laminar_maxfunction mptcp_pm_get_endp_fullmesh_maxfunction mptcp_pm_get_limit_add_addr_acceptedfunction mptcp_pm_get_limit_extra_subflowsfunction has_subflow_daddrfunction mptcp_for_each_subflowfunction select_local_addressfunction select_signal_addressfunction fill_remote_addrfunction fill_remote_addresses_fullmeshfunction mptcp_for_each_subflowfunction fill_remote_addresses_vecfunction __lookup_addr_by_idfunction list_for_each_entry_rcufunction __lookup_addrfunction list_for_each_entry_rcufunction mptcp_endp_get_local_idfunction mptcp_mpc_endpoint_setupfunction mptcp_pm_create_subflow_or_signal_addrfunction mptcp_pm_nl_fully_establishedfunction mptcp_pm_nl_subflow_establishedfunction fill_local_addresses_vec_fullmeshfunction fill_local_laminar_endpfunction fill_local_addresses_vec_c_flagfunction fill_local_address_anyfunction fill_local_addresses_vecfunction mptcp_pm_nl_add_addr_receivedfunction mptcp_pm_nl_rm_addrfunction address_use_portfunction __mptcp_pm_release_addr_entryfunction mptcp_pm_nl_append_new_local_addrfunction mptcp_pm_nl_create_listen_socketfunction mptcp_pm_nl_get_local_idfunction mptcp_pm_nl_is_backupfunction mptcp_nl_add_subflow_or_signal_addrfunction mptcp_pm_nl_add_addr_doitfunction mptcp_pm_remove_announcedfunction __mark_subflow_endp_availablefunction mptcp_nl_remove_subflow_and_signal_addrfunction mptcp_nl_remove_id_zero_addressfunction mptcp_pm_nl_del_addr_doitfunction mptcp_pm_flush_addrs_and_subflowsfunction mptcp_nl_flush_addrs_listfunction __flush_addrs
Annotated Snippet
struct pm_nl_pernet {
/* protects pernet updates */
spinlock_t lock;
struct list_head endp_list;
u8 endpoints;
u8 endp_signal_max;
u8 endp_subflow_max;
u8 endp_laminar_max;
u8 endp_fullmesh_max;
u8 limit_add_addr_accepted;
u8 limit_extra_subflows;
u8 next_id;
DECLARE_BITMAP(id_bitmap, MPTCP_PM_MAX_ADDR_ID + 1);
};
#define MPTCP_PM_ADDR_MAX 8
#define MPTCP_PM_SUBFLOWS_MAX 64
static struct pm_nl_pernet *pm_nl_get_pernet(const struct net *net)
{
return net_generic(net, pm_nl_pernet_id);
}
static struct pm_nl_pernet *
pm_nl_get_pernet_from_msk(const struct mptcp_sock *msk)
{
return pm_nl_get_pernet(sock_net((struct sock *)msk));
}
static struct pm_nl_pernet *genl_info_pm_nl(struct genl_info *info)
{
return pm_nl_get_pernet(genl_info_net(info));
}
u8 mptcp_pm_get_endp_signal_max(const struct mptcp_sock *msk)
{
const struct pm_nl_pernet *pernet = pm_nl_get_pernet_from_msk(msk);
return READ_ONCE(pernet->endp_signal_max);
}
EXPORT_SYMBOL_GPL(mptcp_pm_get_endp_signal_max);
u8 mptcp_pm_get_endp_subflow_max(const struct mptcp_sock *msk)
{
struct pm_nl_pernet *pernet = pm_nl_get_pernet_from_msk(msk);
return READ_ONCE(pernet->endp_subflow_max);
}
EXPORT_SYMBOL_GPL(mptcp_pm_get_endp_subflow_max);
u8 mptcp_pm_get_endp_laminar_max(const struct mptcp_sock *msk)
{
struct pm_nl_pernet *pernet = pm_nl_get_pernet_from_msk(msk);
return READ_ONCE(pernet->endp_laminar_max);
}
EXPORT_SYMBOL_GPL(mptcp_pm_get_endp_laminar_max);
u8 mptcp_pm_get_endp_fullmesh_max(const struct mptcp_sock *msk)
{
struct pm_nl_pernet *pernet = pm_nl_get_pernet_from_msk(msk);
return READ_ONCE(pernet->endp_fullmesh_max);
}
EXPORT_SYMBOL_GPL(mptcp_pm_get_endp_fullmesh_max);
u8 mptcp_pm_get_limit_add_addr_accepted(const struct mptcp_sock *msk)
{
struct pm_nl_pernet *pernet = pm_nl_get_pernet_from_msk(msk);
return READ_ONCE(pernet->limit_add_addr_accepted);
}
EXPORT_SYMBOL_GPL(mptcp_pm_get_limit_add_addr_accepted);
u8 mptcp_pm_get_limit_extra_subflows(const struct mptcp_sock *msk)
{
struct pm_nl_pernet *pernet = pm_nl_get_pernet_from_msk(msk);
return READ_ONCE(pernet->limit_extra_subflows);
}
EXPORT_SYMBOL_GPL(mptcp_pm_get_limit_extra_subflows);
static bool has_subflow_daddr(const struct mptcp_sock *msk,
const struct mptcp_addr_info *daddr)
{
struct mptcp_subflow_context *subflow;
struct mptcp_addr_info cur;
mptcp_for_each_subflow(msk, subflow) {
struct sock *ssk = mptcp_subflow_tcp_sock(subflow);
Annotation
- Immediate include surface: `net/netns/generic.h`, `protocol.h`, `mib.h`, `mptcp_pm_gen.h`.
- Detected declarations: `struct pm_nl_pernet`, `function pm_nl_get_pernet_from_msk`, `function mptcp_pm_get_endp_signal_max`, `function mptcp_pm_get_endp_subflow_max`, `function mptcp_pm_get_endp_laminar_max`, `function mptcp_pm_get_endp_fullmesh_max`, `function mptcp_pm_get_limit_add_addr_accepted`, `function mptcp_pm_get_limit_extra_subflows`, `function has_subflow_daddr`, `function mptcp_for_each_subflow`.
- Atlas domain: Networking Core / Sockets, Protocols, Packet Path, And Network Policy.
- Implementation status: integration implementation candidate.
- 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.