aboutsummaryrefslogtreecommitdiffstats
path: root/net/mptcp/sockopt.c
diff options
context:
space:
mode:
authorFlorian Westphal <fw@strlen.de>2021-04-15 16:44:53 -0700
committerDavid S. Miller <davem@davemloft.net>2021-04-16 15:23:10 -0700
commit7896248983ef4eec18c8bd301a81d8672dbc9955 (patch)
treefcc0d5d4b4666741dd9a956bffdb9a1eef482d15 /net/mptcp/sockopt.c
parentmptcp: only admit explicitly supported sockopt (diff)
downloadlinux-dev-7896248983ef4eec18c8bd301a81d8672dbc9955.tar.xz
linux-dev-7896248983ef4eec18c8bd301a81d8672dbc9955.zip
mptcp: add skeleton to sync msk socket options to subflows
Handle following cases: 1. setsockopt is called with multiple subflows. Change might have to be mirrored to all of them. This is done directly in process context/setsockopt call. 2. Outgoing subflow is created after one or several setsockopt() calls have been made. Old setsockopt changes should be synced to the new socket. 3. Incoming subflow, after setsockopt call(s). Cases 2 and 3 are handled right after the join list is spliced to the conn list. Not all sockopt values can be just be copied by value, some require helper calls. Those can acquire socket lock (which can sleep). If the join->conn list splicing is done from preemptible context, synchronization can be done right away, otherwise its deferred to work queue. Acked-by: Paolo Abeni <pabeni@redhat.com> Signed-off-by: Florian Westphal <fw@strlen.de> Signed-off-by: Mat Martineau <mathew.j.martineau@linux.intel.com> Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'net/mptcp/sockopt.c')
-rw-r--r--net/mptcp/sockopt.c19
1 files changed, 19 insertions, 0 deletions
diff --git a/net/mptcp/sockopt.c b/net/mptcp/sockopt.c
index fb98fab252df..4fdc0ad6acf7 100644
--- a/net/mptcp/sockopt.c
+++ b/net/mptcp/sockopt.c
@@ -350,3 +350,22 @@ int mptcp_getsockopt(struct sock *sk, int level, int optname,
return -EOPNOTSUPP;
}
+void mptcp_sockopt_sync(struct mptcp_sock *msk, struct sock *ssk)
+{
+ msk_owned_by_me(msk);
+}
+
+void mptcp_sockopt_sync_all(struct mptcp_sock *msk)
+{
+ struct mptcp_subflow_context *subflow;
+
+ msk_owned_by_me(msk);
+
+ mptcp_for_each_subflow(msk, subflow) {
+ struct sock *ssk = mptcp_subflow_tcp_sock(subflow);
+
+ mptcp_sockopt_sync(msk, ssk);
+
+ cond_resched();
+ }
+}