Commit 4d078475 authored by Jakub Kicinski's avatar Jakub Kicinski

Merge branch 'mptcp-so_sndtimeo-and-misc-cleanup'

Mat Martineau says:

====================
mptcp: SO_SNDTIMEO and misc. cleanup

Patch 1 adds support for the SO_SNDTIMEO socket option on MPTCP sockets.

The remaining patches are various small cleanups:

Patch 2 removes an obsolete declaration.

Patches 3 and 5 remove unnecessary function parameters.

Patch 4 removes an extra cast.

Patches 6 and 7 add some const and ro_after_init modifiers.

Patch 8 removes extra storage of TCP helpers.
====================

Link: https://lore.kernel.org/r/20220216021130.171786-1-mathew.j.martineau@linux.intel.comSigned-off-by: default avatarJakub Kicinski <kuba@kernel.org>
parents 8c16baa5 952382c6
...@@ -217,12 +217,6 @@ static inline bool rsk_drop_req(const struct request_sock *req) ...@@ -217,12 +217,6 @@ static inline bool rsk_drop_req(const struct request_sock *req)
return false; return false;
} }
static inline void mptcp_parse_option(const struct sk_buff *skb,
const unsigned char *ptr, int opsize,
struct tcp_options_received *opt_rx)
{
}
static inline bool mptcp_syn_options(struct sock *sk, const struct sk_buff *skb, static inline bool mptcp_syn_options(struct sock *sk, const struct sk_buff *skb,
unsigned int *size, unsigned int *size,
struct mptcp_out_options *opts) struct mptcp_out_options *opts)
......
...@@ -355,8 +355,7 @@ static void mptcp_parse_option(const struct sk_buff *skb, ...@@ -355,8 +355,7 @@ static void mptcp_parse_option(const struct sk_buff *skb,
} }
} }
void mptcp_get_options(const struct sock *sk, void mptcp_get_options(const struct sk_buff *skb,
const struct sk_buff *skb,
struct mptcp_options_received *mp_opt) struct mptcp_options_received *mp_opt)
{ {
const struct tcphdr *th = tcp_hdr(skb); const struct tcphdr *th = tcp_hdr(skb);
...@@ -653,7 +652,6 @@ static bool mptcp_established_options_add_addr(struct sock *sk, struct sk_buff * ...@@ -653,7 +652,6 @@ static bool mptcp_established_options_add_addr(struct sock *sk, struct sk_buff *
bool drop_other_suboptions = false; bool drop_other_suboptions = false;
unsigned int opt_size = *size; unsigned int opt_size = *size;
bool echo; bool echo;
bool port;
int len; int len;
/* add addr will strip the existing options, be sure to avoid breaking /* add addr will strip the existing options, be sure to avoid breaking
...@@ -662,12 +660,12 @@ static bool mptcp_established_options_add_addr(struct sock *sk, struct sk_buff * ...@@ -662,12 +660,12 @@ static bool mptcp_established_options_add_addr(struct sock *sk, struct sk_buff *
if (!mptcp_pm_should_add_signal(msk) || if (!mptcp_pm_should_add_signal(msk) ||
(opts->suboptions & (OPTION_MPTCP_MPJ_ACK | OPTION_MPTCP_MPC_ACK)) || (opts->suboptions & (OPTION_MPTCP_MPJ_ACK | OPTION_MPTCP_MPC_ACK)) ||
!mptcp_pm_add_addr_signal(msk, skb, opt_size, remaining, &opts->addr, !mptcp_pm_add_addr_signal(msk, skb, opt_size, remaining, &opts->addr,
&echo, &port, &drop_other_suboptions)) &echo, &drop_other_suboptions))
return false; return false;
if (drop_other_suboptions) if (drop_other_suboptions)
remaining += opt_size; remaining += opt_size;
len = mptcp_add_addr_len(opts->addr.family, echo, port); len = mptcp_add_addr_len(opts->addr.family, echo, !!opts->addr.port);
if (remaining < len) if (remaining < len)
return false; return false;
...@@ -1086,8 +1084,7 @@ static bool add_addr_hmac_valid(struct mptcp_sock *msk, ...@@ -1086,8 +1084,7 @@ static bool add_addr_hmac_valid(struct mptcp_sock *msk,
&mp_opt->addr); &mp_opt->addr);
pr_debug("msk=%p, ahmac=%llu, mp_opt->ahmac=%llu\n", pr_debug("msk=%p, ahmac=%llu, mp_opt->ahmac=%llu\n",
msk, (unsigned long long)hmac, msk, hmac, mp_opt->ahmac);
(unsigned long long)mp_opt->ahmac);
return hmac == mp_opt->ahmac; return hmac == mp_opt->ahmac;
} }
...@@ -1114,7 +1111,7 @@ bool mptcp_incoming_options(struct sock *sk, struct sk_buff *skb) ...@@ -1114,7 +1111,7 @@ bool mptcp_incoming_options(struct sock *sk, struct sk_buff *skb)
return true; return true;
} }
mptcp_get_options(sk, skb, &mp_opt); mptcp_get_options(skb, &mp_opt);
/* The subflow can be in close state only if check_fully_established() /* The subflow can be in close state only if check_fully_established()
* just sent a reset. If so, tell the caller to ignore the current packet. * just sent a reset. If so, tell the caller to ignore the current packet.
......
...@@ -219,7 +219,7 @@ void mptcp_pm_add_addr_received(struct mptcp_sock *msk, ...@@ -219,7 +219,7 @@ void mptcp_pm_add_addr_received(struct mptcp_sock *msk,
} }
void mptcp_pm_add_addr_echoed(struct mptcp_sock *msk, void mptcp_pm_add_addr_echoed(struct mptcp_sock *msk,
struct mptcp_addr_info *addr) const struct mptcp_addr_info *addr)
{ {
struct mptcp_pm_data *pm = &msk->pm; struct mptcp_pm_data *pm = &msk->pm;
...@@ -275,14 +275,15 @@ void mptcp_pm_mp_fail_received(struct sock *sk, u64 fail_seq) ...@@ -275,14 +275,15 @@ void mptcp_pm_mp_fail_received(struct sock *sk, u64 fail_seq)
/* path manager helpers */ /* path manager helpers */
bool mptcp_pm_add_addr_signal(struct mptcp_sock *msk, struct sk_buff *skb, bool mptcp_pm_add_addr_signal(struct mptcp_sock *msk, const struct sk_buff *skb,
unsigned int opt_size, unsigned int remaining, unsigned int opt_size, unsigned int remaining,
struct mptcp_addr_info *addr, bool *echo, struct mptcp_addr_info *addr, bool *echo,
bool *port, bool *drop_other_suboptions) bool *drop_other_suboptions)
{ {
int ret = false; int ret = false;
u8 add_addr; u8 add_addr;
u8 family; u8 family;
bool port;
spin_lock_bh(&msk->pm.lock); spin_lock_bh(&msk->pm.lock);
...@@ -300,10 +301,10 @@ bool mptcp_pm_add_addr_signal(struct mptcp_sock *msk, struct sk_buff *skb, ...@@ -300,10 +301,10 @@ bool mptcp_pm_add_addr_signal(struct mptcp_sock *msk, struct sk_buff *skb,
} }
*echo = mptcp_pm_should_add_signal_echo(msk); *echo = mptcp_pm_should_add_signal_echo(msk);
*port = !!(*echo ? msk->pm.remote.port : msk->pm.local.port); port = !!(*echo ? msk->pm.remote.port : msk->pm.local.port);
family = *echo ? msk->pm.remote.family : msk->pm.local.family; family = *echo ? msk->pm.remote.family : msk->pm.local.family;
if (remaining < mptcp_add_addr_len(family, *echo, *port)) if (remaining < mptcp_add_addr_len(family, *echo, port))
goto out_unlock; goto out_unlock;
if (*echo) { if (*echo) {
......
...@@ -120,7 +120,7 @@ static void remote_address(const struct sock_common *skc, ...@@ -120,7 +120,7 @@ static void remote_address(const struct sock_common *skc,
} }
static bool lookup_subflow_by_saddr(const struct list_head *list, static bool lookup_subflow_by_saddr(const struct list_head *list,
struct mptcp_addr_info *saddr) const struct mptcp_addr_info *saddr)
{ {
struct mptcp_subflow_context *subflow; struct mptcp_subflow_context *subflow;
struct mptcp_addr_info cur; struct mptcp_addr_info cur;
...@@ -138,7 +138,7 @@ static bool lookup_subflow_by_saddr(const struct list_head *list, ...@@ -138,7 +138,7 @@ static bool lookup_subflow_by_saddr(const struct list_head *list,
} }
static bool lookup_subflow_by_daddr(const struct list_head *list, static bool lookup_subflow_by_daddr(const struct list_head *list,
struct mptcp_addr_info *daddr) const struct mptcp_addr_info *daddr)
{ {
struct mptcp_subflow_context *subflow; struct mptcp_subflow_context *subflow;
struct mptcp_addr_info cur; struct mptcp_addr_info cur;
...@@ -157,10 +157,10 @@ static bool lookup_subflow_by_daddr(const struct list_head *list, ...@@ -157,10 +157,10 @@ static bool lookup_subflow_by_daddr(const struct list_head *list,
static struct mptcp_pm_addr_entry * static struct mptcp_pm_addr_entry *
select_local_address(const struct pm_nl_pernet *pernet, select_local_address(const struct pm_nl_pernet *pernet,
struct mptcp_sock *msk) const struct mptcp_sock *msk)
{ {
const struct sock *sk = (const struct sock *)msk;
struct mptcp_pm_addr_entry *entry, *ret = NULL; struct mptcp_pm_addr_entry *entry, *ret = NULL;
struct sock *sk = (struct sock *)msk;
msk_owned_by_me(msk); msk_owned_by_me(msk);
...@@ -190,7 +190,7 @@ select_local_address(const struct pm_nl_pernet *pernet, ...@@ -190,7 +190,7 @@ select_local_address(const struct pm_nl_pernet *pernet,
} }
static struct mptcp_pm_addr_entry * static struct mptcp_pm_addr_entry *
select_signal_address(struct pm_nl_pernet *pernet, struct mptcp_sock *msk) select_signal_address(struct pm_nl_pernet *pernet, const struct mptcp_sock *msk)
{ {
struct mptcp_pm_addr_entry *entry, *ret = NULL; struct mptcp_pm_addr_entry *entry, *ret = NULL;
...@@ -214,16 +214,16 @@ select_signal_address(struct pm_nl_pernet *pernet, struct mptcp_sock *msk) ...@@ -214,16 +214,16 @@ select_signal_address(struct pm_nl_pernet *pernet, struct mptcp_sock *msk)
return ret; return ret;
} }
unsigned int mptcp_pm_get_add_addr_signal_max(struct mptcp_sock *msk) unsigned int mptcp_pm_get_add_addr_signal_max(const struct mptcp_sock *msk)
{ {
struct pm_nl_pernet *pernet; const struct pm_nl_pernet *pernet;
pernet = net_generic(sock_net((struct sock *)msk), pm_nl_pernet_id); pernet = net_generic(sock_net((const struct sock *)msk), pm_nl_pernet_id);
return READ_ONCE(pernet->add_addr_signal_max); return READ_ONCE(pernet->add_addr_signal_max);
} }
EXPORT_SYMBOL_GPL(mptcp_pm_get_add_addr_signal_max); EXPORT_SYMBOL_GPL(mptcp_pm_get_add_addr_signal_max);
unsigned int mptcp_pm_get_add_addr_accept_max(struct mptcp_sock *msk) unsigned int mptcp_pm_get_add_addr_accept_max(const struct mptcp_sock *msk)
{ {
struct pm_nl_pernet *pernet; struct pm_nl_pernet *pernet;
...@@ -232,7 +232,7 @@ unsigned int mptcp_pm_get_add_addr_accept_max(struct mptcp_sock *msk) ...@@ -232,7 +232,7 @@ unsigned int mptcp_pm_get_add_addr_accept_max(struct mptcp_sock *msk)
} }
EXPORT_SYMBOL_GPL(mptcp_pm_get_add_addr_accept_max); EXPORT_SYMBOL_GPL(mptcp_pm_get_add_addr_accept_max);
unsigned int mptcp_pm_get_subflows_max(struct mptcp_sock *msk) unsigned int mptcp_pm_get_subflows_max(const struct mptcp_sock *msk)
{ {
struct pm_nl_pernet *pernet; struct pm_nl_pernet *pernet;
...@@ -241,7 +241,7 @@ unsigned int mptcp_pm_get_subflows_max(struct mptcp_sock *msk) ...@@ -241,7 +241,7 @@ unsigned int mptcp_pm_get_subflows_max(struct mptcp_sock *msk)
} }
EXPORT_SYMBOL_GPL(mptcp_pm_get_subflows_max); EXPORT_SYMBOL_GPL(mptcp_pm_get_subflows_max);
unsigned int mptcp_pm_get_local_addr_max(struct mptcp_sock *msk) unsigned int mptcp_pm_get_local_addr_max(const struct mptcp_sock *msk)
{ {
struct pm_nl_pernet *pernet; struct pm_nl_pernet *pernet;
...@@ -264,8 +264,8 @@ bool mptcp_pm_nl_check_work_pending(struct mptcp_sock *msk) ...@@ -264,8 +264,8 @@ bool mptcp_pm_nl_check_work_pending(struct mptcp_sock *msk)
} }
struct mptcp_pm_add_entry * struct mptcp_pm_add_entry *
mptcp_lookup_anno_list_by_saddr(struct mptcp_sock *msk, mptcp_lookup_anno_list_by_saddr(const struct mptcp_sock *msk,
struct mptcp_addr_info *addr) const struct mptcp_addr_info *addr)
{ {
struct mptcp_pm_add_entry *entry; struct mptcp_pm_add_entry *entry;
...@@ -346,7 +346,7 @@ static void mptcp_pm_add_timer(struct timer_list *timer) ...@@ -346,7 +346,7 @@ static void mptcp_pm_add_timer(struct timer_list *timer)
struct mptcp_pm_add_entry * struct mptcp_pm_add_entry *
mptcp_pm_del_add_timer(struct mptcp_sock *msk, mptcp_pm_del_add_timer(struct mptcp_sock *msk,
struct mptcp_addr_info *addr, bool check_id) const struct mptcp_addr_info *addr, bool check_id)
{ {
struct mptcp_pm_add_entry *entry; struct mptcp_pm_add_entry *entry;
struct sock *sk = (struct sock *)msk; struct sock *sk = (struct sock *)msk;
...@@ -364,7 +364,7 @@ mptcp_pm_del_add_timer(struct mptcp_sock *msk, ...@@ -364,7 +364,7 @@ mptcp_pm_del_add_timer(struct mptcp_sock *msk,
} }
static bool mptcp_pm_alloc_anno_list(struct mptcp_sock *msk, static bool mptcp_pm_alloc_anno_list(struct mptcp_sock *msk,
struct mptcp_pm_addr_entry *entry) const struct mptcp_pm_addr_entry *entry)
{ {
struct mptcp_pm_add_entry *add_entry = NULL; struct mptcp_pm_add_entry *add_entry = NULL;
struct sock *sk = (struct sock *)msk; struct sock *sk = (struct sock *)msk;
...@@ -410,8 +410,8 @@ void mptcp_pm_free_anno_list(struct mptcp_sock *msk) ...@@ -410,8 +410,8 @@ void mptcp_pm_free_anno_list(struct mptcp_sock *msk)
} }
} }
static bool lookup_address_in_vec(struct mptcp_addr_info *addrs, unsigned int nr, static bool lookup_address_in_vec(const struct mptcp_addr_info *addrs, unsigned int nr,
struct mptcp_addr_info *addr) const struct mptcp_addr_info *addr)
{ {
int i; int i;
...@@ -493,9 +493,9 @@ __lookup_addr(struct pm_nl_pernet *pernet, const struct mptcp_addr_info *info, ...@@ -493,9 +493,9 @@ __lookup_addr(struct pm_nl_pernet *pernet, const struct mptcp_addr_info *info,
} }
static int static int
lookup_id_by_addr(struct pm_nl_pernet *pernet, const struct mptcp_addr_info *addr) lookup_id_by_addr(const struct pm_nl_pernet *pernet, const struct mptcp_addr_info *addr)
{ {
struct mptcp_pm_addr_entry *entry; const struct mptcp_pm_addr_entry *entry;
int ret = -1; int ret = -1;
rcu_read_lock(); rcu_read_lock();
...@@ -1281,7 +1281,7 @@ int mptcp_pm_get_flags_and_ifindex_by_id(struct net *net, unsigned int id, ...@@ -1281,7 +1281,7 @@ int mptcp_pm_get_flags_and_ifindex_by_id(struct net *net, unsigned int id,
} }
static bool remove_anno_list_by_saddr(struct mptcp_sock *msk, static bool remove_anno_list_by_saddr(struct mptcp_sock *msk,
struct mptcp_addr_info *addr) const struct mptcp_addr_info *addr)
{ {
struct mptcp_pm_add_entry *entry; struct mptcp_pm_add_entry *entry;
...@@ -1296,7 +1296,7 @@ static bool remove_anno_list_by_saddr(struct mptcp_sock *msk, ...@@ -1296,7 +1296,7 @@ static bool remove_anno_list_by_saddr(struct mptcp_sock *msk,
} }
static bool mptcp_pm_remove_anno_addr(struct mptcp_sock *msk, static bool mptcp_pm_remove_anno_addr(struct mptcp_sock *msk,
struct mptcp_addr_info *addr, const struct mptcp_addr_info *addr,
bool force) bool force)
{ {
struct mptcp_rm_list list = { .nr = 0 }; struct mptcp_rm_list list = { .nr = 0 };
......
...@@ -468,9 +468,7 @@ struct mptcp_subflow_context { ...@@ -468,9 +468,7 @@ struct mptcp_subflow_context {
struct sock *tcp_sock; /* tcp sk backpointer */ struct sock *tcp_sock; /* tcp sk backpointer */
struct sock *conn; /* parent mptcp_sock */ struct sock *conn; /* parent mptcp_sock */
const struct inet_connection_sock_af_ops *icsk_af_ops; const struct inet_connection_sock_af_ops *icsk_af_ops;
void (*tcp_data_ready)(struct sock *sk);
void (*tcp_state_change)(struct sock *sk); void (*tcp_state_change)(struct sock *sk);
void (*tcp_write_space)(struct sock *sk);
void (*tcp_error_report)(struct sock *sk); void (*tcp_error_report)(struct sock *sk);
struct rcu_head rcu; struct rcu_head rcu;
...@@ -614,9 +612,9 @@ bool mptcp_subflow_active(struct mptcp_subflow_context *subflow); ...@@ -614,9 +612,9 @@ bool mptcp_subflow_active(struct mptcp_subflow_context *subflow);
static inline void mptcp_subflow_tcp_fallback(struct sock *sk, static inline void mptcp_subflow_tcp_fallback(struct sock *sk,
struct mptcp_subflow_context *ctx) struct mptcp_subflow_context *ctx)
{ {
sk->sk_data_ready = ctx->tcp_data_ready; sk->sk_data_ready = sock_def_readable;
sk->sk_state_change = ctx->tcp_state_change; sk->sk_state_change = ctx->tcp_state_change;
sk->sk_write_space = ctx->tcp_write_space; sk->sk_write_space = sk_stream_write_space;
sk->sk_error_report = ctx->tcp_error_report; sk->sk_error_report = ctx->tcp_error_report;
inet_csk(sk)->icsk_af_ops = ctx->icsk_af_ops; inet_csk(sk)->icsk_af_ops = ctx->icsk_af_ops;
...@@ -643,8 +641,7 @@ int __init mptcp_proto_v6_init(void); ...@@ -643,8 +641,7 @@ int __init mptcp_proto_v6_init(void);
struct sock *mptcp_sk_clone(const struct sock *sk, struct sock *mptcp_sk_clone(const struct sock *sk,
const struct mptcp_options_received *mp_opt, const struct mptcp_options_received *mp_opt,
struct request_sock *req); struct request_sock *req);
void mptcp_get_options(const struct sock *sk, void mptcp_get_options(const struct sk_buff *skb,
const struct sk_buff *skb,
struct mptcp_options_received *mp_opt); struct mptcp_options_received *mp_opt);
void mptcp_finish_connect(struct sock *sk); void mptcp_finish_connect(struct sock *sk);
...@@ -743,7 +740,7 @@ void mptcp_pm_subflow_check_next(struct mptcp_sock *msk, const struct sock *ssk, ...@@ -743,7 +740,7 @@ void mptcp_pm_subflow_check_next(struct mptcp_sock *msk, const struct sock *ssk,
void mptcp_pm_add_addr_received(struct mptcp_sock *msk, void mptcp_pm_add_addr_received(struct mptcp_sock *msk,
const struct mptcp_addr_info *addr); const struct mptcp_addr_info *addr);
void mptcp_pm_add_addr_echoed(struct mptcp_sock *msk, void mptcp_pm_add_addr_echoed(struct mptcp_sock *msk,
struct mptcp_addr_info *addr); const struct mptcp_addr_info *addr);
void mptcp_pm_add_addr_send_ack(struct mptcp_sock *msk); void mptcp_pm_add_addr_send_ack(struct mptcp_sock *msk);
void mptcp_pm_nl_addr_send_ack(struct mptcp_sock *msk); void mptcp_pm_nl_addr_send_ack(struct mptcp_sock *msk);
void mptcp_pm_rm_addr_received(struct mptcp_sock *msk, void mptcp_pm_rm_addr_received(struct mptcp_sock *msk,
...@@ -754,10 +751,10 @@ void mptcp_pm_free_anno_list(struct mptcp_sock *msk); ...@@ -754,10 +751,10 @@ void mptcp_pm_free_anno_list(struct mptcp_sock *msk);
bool mptcp_pm_sport_in_anno_list(struct mptcp_sock *msk, const struct sock *sk); bool mptcp_pm_sport_in_anno_list(struct mptcp_sock *msk, const struct sock *sk);
struct mptcp_pm_add_entry * struct mptcp_pm_add_entry *
mptcp_pm_del_add_timer(struct mptcp_sock *msk, mptcp_pm_del_add_timer(struct mptcp_sock *msk,
struct mptcp_addr_info *addr, bool check_id); const struct mptcp_addr_info *addr, bool check_id);
struct mptcp_pm_add_entry * struct mptcp_pm_add_entry *
mptcp_lookup_anno_list_by_saddr(struct mptcp_sock *msk, mptcp_lookup_anno_list_by_saddr(const struct mptcp_sock *msk,
struct mptcp_addr_info *addr); const struct mptcp_addr_info *addr);
int mptcp_pm_get_flags_and_ifindex_by_id(struct net *net, unsigned int id, int mptcp_pm_get_flags_and_ifindex_by_id(struct net *net, unsigned int id,
u8 *flags, int *ifindex); u8 *flags, int *ifindex);
...@@ -816,10 +813,10 @@ static inline int mptcp_rm_addr_len(const struct mptcp_rm_list *rm_list) ...@@ -816,10 +813,10 @@ static inline int mptcp_rm_addr_len(const struct mptcp_rm_list *rm_list)
return TCPOLEN_MPTCP_RM_ADDR_BASE + roundup(rm_list->nr - 1, 4) + 1; return TCPOLEN_MPTCP_RM_ADDR_BASE + roundup(rm_list->nr - 1, 4) + 1;
} }
bool mptcp_pm_add_addr_signal(struct mptcp_sock *msk, struct sk_buff *skb, bool mptcp_pm_add_addr_signal(struct mptcp_sock *msk, const struct sk_buff *skb,
unsigned int opt_size, unsigned int remaining, unsigned int opt_size, unsigned int remaining,
struct mptcp_addr_info *addr, bool *echo, struct mptcp_addr_info *addr, bool *echo,
bool *port, bool *drop_other_suboptions); bool *drop_other_suboptions);
bool mptcp_pm_rm_addr_signal(struct mptcp_sock *msk, unsigned int remaining, bool mptcp_pm_rm_addr_signal(struct mptcp_sock *msk, unsigned int remaining,
struct mptcp_rm_list *rm_list); struct mptcp_rm_list *rm_list);
int mptcp_pm_get_local_id(struct mptcp_sock *msk, struct sock_common *skc); int mptcp_pm_get_local_id(struct mptcp_sock *msk, struct sock_common *skc);
...@@ -830,10 +827,10 @@ void mptcp_pm_nl_work(struct mptcp_sock *msk); ...@@ -830,10 +827,10 @@ void mptcp_pm_nl_work(struct mptcp_sock *msk);
void mptcp_pm_nl_rm_subflow_received(struct mptcp_sock *msk, void mptcp_pm_nl_rm_subflow_received(struct mptcp_sock *msk,
const struct mptcp_rm_list *rm_list); const struct mptcp_rm_list *rm_list);
int mptcp_pm_nl_get_local_id(struct mptcp_sock *msk, struct sock_common *skc); int mptcp_pm_nl_get_local_id(struct mptcp_sock *msk, struct sock_common *skc);
unsigned int mptcp_pm_get_add_addr_signal_max(struct mptcp_sock *msk); unsigned int mptcp_pm_get_add_addr_signal_max(const struct mptcp_sock *msk);
unsigned int mptcp_pm_get_add_addr_accept_max(struct mptcp_sock *msk); unsigned int mptcp_pm_get_add_addr_accept_max(const struct mptcp_sock *msk);
unsigned int mptcp_pm_get_subflows_max(struct mptcp_sock *msk); unsigned int mptcp_pm_get_subflows_max(const struct mptcp_sock *msk);
unsigned int mptcp_pm_get_local_addr_max(struct mptcp_sock *msk); unsigned int mptcp_pm_get_local_addr_max(const struct mptcp_sock *msk);
void mptcp_sockopt_sync(struct mptcp_sock *msk, struct sock *ssk); void mptcp_sockopt_sync(struct mptcp_sock *msk, struct sock *ssk);
void mptcp_sockopt_sync_locked(struct mptcp_sock *msk, struct sock *ssk); void mptcp_sockopt_sync_locked(struct mptcp_sock *msk, struct sock *ssk);
......
...@@ -343,6 +343,8 @@ static int mptcp_setsockopt_sol_socket(struct mptcp_sock *msk, int optname, ...@@ -343,6 +343,8 @@ static int mptcp_setsockopt_sol_socket(struct mptcp_sock *msk, int optname,
case SO_RCVLOWAT: case SO_RCVLOWAT:
case SO_RCVTIMEO_OLD: case SO_RCVTIMEO_OLD:
case SO_RCVTIMEO_NEW: case SO_RCVTIMEO_NEW:
case SO_SNDTIMEO_OLD:
case SO_SNDTIMEO_NEW:
case SO_BUSY_POLL: case SO_BUSY_POLL:
case SO_PREFER_BUSY_POLL: case SO_PREFER_BUSY_POLL:
case SO_BUSY_POLL_BUDGET: case SO_BUSY_POLL_BUDGET:
......
...@@ -153,7 +153,7 @@ static int subflow_check_req(struct request_sock *req, ...@@ -153,7 +153,7 @@ static int subflow_check_req(struct request_sock *req,
return -EINVAL; return -EINVAL;
#endif #endif
mptcp_get_options(sk_listener, skb, &mp_opt); mptcp_get_options(skb, &mp_opt);
opt_mp_capable = !!(mp_opt.suboptions & OPTIONS_MPTCP_MPC); opt_mp_capable = !!(mp_opt.suboptions & OPTIONS_MPTCP_MPC);
opt_mp_join = !!(mp_opt.suboptions & OPTIONS_MPTCP_MPJ); opt_mp_join = !!(mp_opt.suboptions & OPTIONS_MPTCP_MPJ);
...@@ -250,7 +250,7 @@ int mptcp_subflow_init_cookie_req(struct request_sock *req, ...@@ -250,7 +250,7 @@ int mptcp_subflow_init_cookie_req(struct request_sock *req,
int err; int err;
subflow_init_req(req, sk_listener); subflow_init_req(req, sk_listener);
mptcp_get_options(sk_listener, skb, &mp_opt); mptcp_get_options(skb, &mp_opt);
opt_mp_capable = !!(mp_opt.suboptions & OPTIONS_MPTCP_MPC); opt_mp_capable = !!(mp_opt.suboptions & OPTIONS_MPTCP_MPC);
opt_mp_join = !!(mp_opt.suboptions & OPTIONS_MPTCP_MPJ); opt_mp_join = !!(mp_opt.suboptions & OPTIONS_MPTCP_MPJ);
...@@ -344,9 +344,7 @@ static bool subflow_thmac_valid(struct mptcp_subflow_context *subflow) ...@@ -344,9 +344,7 @@ static bool subflow_thmac_valid(struct mptcp_subflow_context *subflow)
thmac = get_unaligned_be64(hmac); thmac = get_unaligned_be64(hmac);
pr_debug("subflow=%p, token=%u, thmac=%llu, subflow->thmac=%llu\n", pr_debug("subflow=%p, token=%u, thmac=%llu, subflow->thmac=%llu\n",
subflow, subflow->token, subflow, subflow->token, thmac, subflow->thmac);
(unsigned long long)thmac,
(unsigned long long)subflow->thmac);
return thmac == subflow->thmac; return thmac == subflow->thmac;
} }
...@@ -410,7 +408,7 @@ static void subflow_finish_connect(struct sock *sk, const struct sk_buff *skb) ...@@ -410,7 +408,7 @@ static void subflow_finish_connect(struct sock *sk, const struct sk_buff *skb)
subflow->ssn_offset = TCP_SKB_CB(skb)->seq; subflow->ssn_offset = TCP_SKB_CB(skb)->seq;
pr_debug("subflow=%p synack seq=%x", subflow, subflow->ssn_offset); pr_debug("subflow=%p synack seq=%x", subflow, subflow->ssn_offset);
mptcp_get_options(sk, skb, &mp_opt); mptcp_get_options(skb, &mp_opt);
if (subflow->request_mptcp) { if (subflow->request_mptcp) {
if (!(mp_opt.suboptions & OPTIONS_MPTCP_MPC)) { if (!(mp_opt.suboptions & OPTIONS_MPTCP_MPC)) {
MPTCP_INC_STATS(sock_net(sk), MPTCP_INC_STATS(sock_net(sk),
...@@ -484,8 +482,7 @@ static void subflow_finish_connect(struct sock *sk, const struct sk_buff *skb) ...@@ -484,8 +482,7 @@ static void subflow_finish_connect(struct sock *sk, const struct sk_buff *skb)
} }
struct request_sock_ops mptcp_subflow_request_sock_ops; struct request_sock_ops mptcp_subflow_request_sock_ops;
EXPORT_SYMBOL_GPL(mptcp_subflow_request_sock_ops); static struct tcp_request_sock_ops subflow_request_sock_ipv4_ops __ro_after_init;
static struct tcp_request_sock_ops subflow_request_sock_ipv4_ops;
static int subflow_v4_conn_request(struct sock *sk, struct sk_buff *skb) static int subflow_v4_conn_request(struct sock *sk, struct sk_buff *skb)
{ {
...@@ -506,9 +503,9 @@ static int subflow_v4_conn_request(struct sock *sk, struct sk_buff *skb) ...@@ -506,9 +503,9 @@ static int subflow_v4_conn_request(struct sock *sk, struct sk_buff *skb)
} }
#if IS_ENABLED(CONFIG_MPTCP_IPV6) #if IS_ENABLED(CONFIG_MPTCP_IPV6)
static struct tcp_request_sock_ops subflow_request_sock_ipv6_ops; static struct tcp_request_sock_ops subflow_request_sock_ipv6_ops __ro_after_init;
static struct inet_connection_sock_af_ops subflow_v6_specific; static struct inet_connection_sock_af_ops subflow_v6_specific __ro_after_init;
static struct inet_connection_sock_af_ops subflow_v6m_specific; static struct inet_connection_sock_af_ops subflow_v6m_specific __ro_after_init;
static struct proto tcpv6_prot_override; static struct proto tcpv6_prot_override;
static int subflow_v6_conn_request(struct sock *sk, struct sk_buff *skb) static int subflow_v6_conn_request(struct sock *sk, struct sk_buff *skb)
...@@ -663,7 +660,7 @@ static struct sock *subflow_syn_recv_sock(const struct sock *sk, ...@@ -663,7 +660,7 @@ static struct sock *subflow_syn_recv_sock(const struct sock *sk,
* reordered MPC will cause fallback, but we don't have other * reordered MPC will cause fallback, but we don't have other
* options. * options.
*/ */
mptcp_get_options(sk, skb, &mp_opt); mptcp_get_options(skb, &mp_opt);
if (!(mp_opt.suboptions & OPTIONS_MPTCP_MPC)) { if (!(mp_opt.suboptions & OPTIONS_MPTCP_MPC)) {
fallback = true; fallback = true;
goto create_child; goto create_child;
...@@ -673,7 +670,7 @@ static struct sock *subflow_syn_recv_sock(const struct sock *sk, ...@@ -673,7 +670,7 @@ static struct sock *subflow_syn_recv_sock(const struct sock *sk,
if (!new_msk) if (!new_msk)
fallback = true; fallback = true;
} else if (subflow_req->mp_join) { } else if (subflow_req->mp_join) {
mptcp_get_options(sk, skb, &mp_opt); mptcp_get_options(skb, &mp_opt);
if (!(mp_opt.suboptions & OPTIONS_MPTCP_MPJ) || if (!(mp_opt.suboptions & OPTIONS_MPTCP_MPJ) ||
!subflow_hmac_valid(req, &mp_opt) || !subflow_hmac_valid(req, &mp_opt) ||
!mptcp_can_accept_new_subflow(subflow_req->msk)) { !mptcp_can_accept_new_subflow(subflow_req->msk)) {
...@@ -790,7 +787,7 @@ static struct sock *subflow_syn_recv_sock(const struct sock *sk, ...@@ -790,7 +787,7 @@ static struct sock *subflow_syn_recv_sock(const struct sock *sk,
return child; return child;
} }
static struct inet_connection_sock_af_ops subflow_specific; static struct inet_connection_sock_af_ops subflow_specific __ro_after_init;
static struct proto tcp_prot_override; static struct proto tcp_prot_override;
enum mapping_status { enum mapping_status {
...@@ -1311,7 +1308,7 @@ static void subflow_write_space(struct sock *ssk) ...@@ -1311,7 +1308,7 @@ static void subflow_write_space(struct sock *ssk)
mptcp_write_space(sk); mptcp_write_space(sk);
} }
static struct inet_connection_sock_af_ops * static const struct inet_connection_sock_af_ops *
subflow_default_af_ops(struct sock *sk) subflow_default_af_ops(struct sock *sk)
{ {
#if IS_ENABLED(CONFIG_MPTCP_IPV6) #if IS_ENABLED(CONFIG_MPTCP_IPV6)
...@@ -1326,7 +1323,7 @@ void mptcpv6_handle_mapped(struct sock *sk, bool mapped) ...@@ -1326,7 +1323,7 @@ void mptcpv6_handle_mapped(struct sock *sk, bool mapped)
{ {
struct mptcp_subflow_context *subflow = mptcp_subflow_ctx(sk); struct mptcp_subflow_context *subflow = mptcp_subflow_ctx(sk);
struct inet_connection_sock *icsk = inet_csk(sk); struct inet_connection_sock *icsk = inet_csk(sk);
struct inet_connection_sock_af_ops *target; const struct inet_connection_sock_af_ops *target;
target = mapped ? &subflow_v6m_specific : subflow_default_af_ops(sk); target = mapped ? &subflow_v6m_specific : subflow_default_af_ops(sk);
...@@ -1657,10 +1654,12 @@ static int subflow_ulp_init(struct sock *sk) ...@@ -1657,10 +1654,12 @@ static int subflow_ulp_init(struct sock *sk)
tp->is_mptcp = 1; tp->is_mptcp = 1;
ctx->icsk_af_ops = icsk->icsk_af_ops; ctx->icsk_af_ops = icsk->icsk_af_ops;
icsk->icsk_af_ops = subflow_default_af_ops(sk); icsk->icsk_af_ops = subflow_default_af_ops(sk);
ctx->tcp_data_ready = sk->sk_data_ready;
ctx->tcp_state_change = sk->sk_state_change; ctx->tcp_state_change = sk->sk_state_change;
ctx->tcp_write_space = sk->sk_write_space;
ctx->tcp_error_report = sk->sk_error_report; ctx->tcp_error_report = sk->sk_error_report;
WARN_ON_ONCE(sk->sk_data_ready != sock_def_readable);
WARN_ON_ONCE(sk->sk_write_space != sk_stream_write_space);
sk->sk_data_ready = subflow_data_ready; sk->sk_data_ready = subflow_data_ready;
sk->sk_write_space = subflow_write_space; sk->sk_write_space = subflow_write_space;
sk->sk_state_change = subflow_state_change; sk->sk_state_change = subflow_state_change;
...@@ -1715,9 +1714,7 @@ static void subflow_ulp_clone(const struct request_sock *req, ...@@ -1715,9 +1714,7 @@ static void subflow_ulp_clone(const struct request_sock *req,
new_ctx->conn_finished = 1; new_ctx->conn_finished = 1;
new_ctx->icsk_af_ops = old_ctx->icsk_af_ops; new_ctx->icsk_af_ops = old_ctx->icsk_af_ops;
new_ctx->tcp_data_ready = old_ctx->tcp_data_ready;
new_ctx->tcp_state_change = old_ctx->tcp_state_change; new_ctx->tcp_state_change = old_ctx->tcp_state_change;
new_ctx->tcp_write_space = old_ctx->tcp_write_space;
new_ctx->tcp_error_report = old_ctx->tcp_error_report; new_ctx->tcp_error_report = old_ctx->tcp_error_report;
new_ctx->rel_write_seq = 1; new_ctx->rel_write_seq = 1;
new_ctx->tcp_sock = newsk; new_ctx->tcp_sock = newsk;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment