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.com Signed-off-by: Jakub Kicinski <kuba@kernel.org>
This commit is contained in:
commit
4d078475bd
|
@ -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,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
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 *
|
||||||
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 *
|
||||||
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,
|
||||||
&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)
|
||||||
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,
|
||||||
}
|
}
|
||||||
|
|
||||||
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)
|
||||||
|
|
||||||
/* 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,
|
||||||
}
|
}
|
||||||
|
|
||||||
*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,
|
||||||
}
|
}
|
||||||
|
|
||||||
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,
|
||||||
}
|
}
|
||||||
|
|
||||||
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,
|
||||||
|
|
||||||
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,
|
||||||
}
|
}
|
||||||
|
|
||||||
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)
|
||||||
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)
|
||||||
}
|
}
|
||||||
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)
|
||||||
}
|
}
|
||||||
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)
|
||||||
}
|
}
|
||||||
|
|
||||||
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 @@ out:
|
||||||
|
|
||||||
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,
|
||||||
}
|
}
|
||||||
|
|
||||||
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)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
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,
|
||||||
}
|
}
|
||||||
|
|
||||||
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,
|
||||||
}
|
}
|
||||||
|
|
||||||
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,
|
||||||
}
|
}
|
||||||
|
|
||||||
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 {
|
||||||
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);
|
||||||
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);
|
||||||
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,
|
||||||
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);
|
||||||
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)
|
||||||
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);
|
||||||
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,
|
||||||
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,
|
||||||
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,
|
||||||
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)
|
||||||
|
|
||||||
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)
|
||||||
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 @@ do_reset:
|
||||||
}
|
}
|
||||||
|
|
||||||
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 @@ drop:
|
||||||
}
|
}
|
||||||
|
|
||||||
#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,
|
||||||
* 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,
|
||||||
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 @@ dispose_child:
|
||||||
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)
|
||||||
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)
|
||||||
{
|
{
|
||||||
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)
|
||||||
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,
|
||||||
|
|
||||||
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;
|
||||||
|
|
Loading…
Reference in New Issue