Skip to content

Commit cdbabff

Browse files
Paolo Abeniintel-lab-lkp
authored andcommitted
mptcp: track fallbacks accurately via mibs
Add the mibs required to cover the few possible fallback causes still lacking suck info. Move the relevant mib increment into the fallback helper, so that no eventual future fallback operation will miss a paired mib increment. Additionally track failed fallback via its own mib, such mib is incremented only when a fallback mandated by the protocol fails - due to racing subflow creation. While at the above, rename an existing helper to reduce long lines problems all along. Signed-off-by: Paolo Abeni <[email protected]>
1 parent e04fe0f commit cdbabff

File tree

7 files changed

+62
-45
lines changed

7 files changed

+62
-45
lines changed

net/mptcp/ctrl.c

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -533,9 +533,9 @@ void mptcp_active_detect_blackhole(struct sock *ssk, bool expired)
533533
to_max = mptcp_get_pernet(net)->syn_retrans_before_tcp_fallback;
534534

535535
if (timeouts == to_max || (timeouts < to_max && expired)) {
536-
MPTCP_INC_STATS(net, MPTCP_MIB_MPCAPABLEACTIVEDROP);
537536
subflow->mpc_drop = 1;
538-
mptcp_subflow_early_fallback(mptcp_sk(subflow->conn), subflow);
537+
mptcp_early_fallback(mptcp_sk(subflow->conn), subflow,
538+
MPTCP_MIB_MPCAPABLEACTIVEDROP);
539539
}
540540
}
541541

net/mptcp/mib.c

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -80,6 +80,11 @@ static const struct snmp_mib mptcp_snmp_list[] = {
8080
SNMP_MIB_ITEM("RcvWndConflict", MPTCP_MIB_RCVWNDCONFLICT),
8181
SNMP_MIB_ITEM("MPCurrEstab", MPTCP_MIB_CURRESTAB),
8282
SNMP_MIB_ITEM("Blackhole", MPTCP_MIB_BLACKHOLE),
83+
SNMP_MIB_ITEM("MPCapableDataFallback", MPTCP_MIB_MPCAPABLEDATAFALLBACK),
84+
SNMP_MIB_ITEM("MD5SigFallback", MPTCP_MIB_MD5SIGFALLBACK),
85+
SNMP_MIB_ITEM("DssFallback", MPTCP_MIB_DSSFALLBACK),
86+
SNMP_MIB_ITEM("SimultConnectFallback", MPTCP_MIB_SIMULTCONNFALLBACK),
87+
SNMP_MIB_ITEM("FallbackFailed", MPTCP_MIB_FALLBACKFAILED),
8388
SNMP_MIB_SENTINEL
8489
};
8590

net/mptcp/mib.h

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -81,6 +81,13 @@ enum linux_mptcp_mib_field {
8181
MPTCP_MIB_RCVWNDCONFLICT, /* Conflict with while updating msk rcv wnd */
8282
MPTCP_MIB_CURRESTAB, /* Current established MPTCP connections */
8383
MPTCP_MIB_BLACKHOLE, /* A blackhole has been detected */
84+
MPTCP_MIB_MPCAPABLEDATAFALLBACK, /* Missing DSS/MPC+data on first
85+
* established packet
86+
*/
87+
MPTCP_MIB_MD5SIGFALLBACK, /* Conflicting TCP option enabled */
88+
MPTCP_MIB_DSSFALLBACK, /* Bad or missing DSS */
89+
MPTCP_MIB_SIMULTCONNFALLBACK, /* Simultaneous connect */
90+
MPTCP_MIB_FALLBACKFAILED, /* Can't fallback due to msk status */
8491
__MPTCP_MIB_MAX
8592
};
8693

net/mptcp/options.c

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -978,8 +978,10 @@ static bool check_fully_established(struct mptcp_sock *msk, struct sock *ssk,
978978
if (subflow->mp_join)
979979
goto reset;
980980
subflow->mp_capable = 0;
981-
if (!mptcp_try_fallback(ssk))
981+
if (!mptcp_try_fallback(ssk, MPTCP_MIB_MPCAPABLEDATAFALLBACK)) {
982+
MPTCP_INC_STATS(sock_net(ssk), MPTCP_MIB_FALLBACKFAILED);
982983
goto reset;
984+
}
983985
pr_fallback(msk);
984986
return false;
985987
}

net/mptcp/protocol.c

Lines changed: 30 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -68,6 +68,26 @@ static const struct proto_ops *mptcp_fallback_tcp_ops(const struct sock *sk)
6868
return &inet_stream_ops;
6969
}
7070

71+
bool __mptcp_try_fallback(struct mptcp_sock *msk, int fb_mib)
72+
{
73+
struct net *net = sock_net((struct sock *)msk);
74+
75+
if (__mptcp_check_fallback(msk))
76+
return true;
77+
78+
spin_lock_bh(&msk->fallback_lock);
79+
if (!msk->allow_infinite_fallback) {
80+
spin_unlock_bh(&msk->fallback_lock);
81+
return false;
82+
}
83+
84+
msk->allow_subflows = false;
85+
set_bit(MPTCP_FALLBACK_DONE, &msk->flags);
86+
__MPTCP_INC_STATS(net, fb_mib);
87+
spin_unlock_bh(&msk->fallback_lock);
88+
return true;
89+
}
90+
7191
static int __mptcp_socket_create(struct mptcp_sock *msk)
7292
{
7393
struct mptcp_subflow_context *subflow;
@@ -561,10 +581,7 @@ static bool mptcp_check_data_fin(struct sock *sk)
561581

562582
static void mptcp_dss_corruption(struct mptcp_sock *msk, struct sock *ssk)
563583
{
564-
if (mptcp_try_fallback(ssk)) {
565-
MPTCP_INC_STATS(sock_net(ssk),
566-
MPTCP_MIB_DSSCORRUPTIONFALLBACK);
567-
} else {
584+
if (!mptcp_try_fallback(ssk, MPTCP_MIB_DSSCORRUPTIONFALLBACK)) {
568585
MPTCP_INC_STATS(sock_net(ssk), MPTCP_MIB_DSSCORRUPTIONRESET);
569586
mptcp_subflow_reset(ssk);
570587
}
@@ -1143,12 +1160,12 @@ static void mptcp_update_infinite_map(struct mptcp_sock *msk,
11431160
mpext->infinite_map = 1;
11441161
mpext->data_len = 0;
11451162

1146-
if (!mptcp_try_fallback(ssk)) {
1163+
if (!mptcp_try_fallback(ssk, MPTCP_MIB_INFINITEMAPTX)) {
1164+
MPTCP_INC_STATS(sock_net(ssk), MPTCP_MIB_FALLBACKFAILED);
11471165
mptcp_subflow_reset(ssk);
11481166
return;
11491167
}
11501168

1151-
MPTCP_INC_STATS(sock_net(ssk), MPTCP_MIB_INFINITEMAPTX);
11521169
mptcp_subflow_ctx(ssk)->send_infinite_map = 0;
11531170
pr_fallback(msk);
11541171
}
@@ -3689,16 +3706,15 @@ static int mptcp_connect(struct sock *sk, struct sockaddr *uaddr, int addr_len)
36893706
* TCP option space.
36903707
*/
36913708
if (rcu_access_pointer(tcp_sk(ssk)->md5sig_info))
3692-
mptcp_subflow_early_fallback(msk, subflow);
3709+
mptcp_early_fallback(msk, subflow, MPTCP_MIB_MD5SIGFALLBACK);
36933710
#endif
36943711
if (subflow->request_mptcp) {
3695-
if (mptcp_active_should_disable(sk)) {
3696-
MPTCP_INC_STATS(sock_net(ssk), MPTCP_MIB_MPCAPABLEACTIVEDISABLED);
3697-
mptcp_subflow_early_fallback(msk, subflow);
3698-
} else if (mptcp_token_new_connect(ssk) < 0) {
3699-
MPTCP_INC_STATS(sock_net(ssk), MPTCP_MIB_TOKENFALLBACKINIT);
3700-
mptcp_subflow_early_fallback(msk, subflow);
3701-
}
3712+
if (mptcp_active_should_disable(sk))
3713+
mptcp_early_fallback(msk, subflow,
3714+
MPTCP_MIB_MPCAPABLEACTIVEDISABLED);
3715+
else if (mptcp_token_new_connect(ssk) < 0)
3716+
mptcp_early_fallback(msk, subflow,
3717+
MPTCP_MIB_TOKENFALLBACKINIT);
37023718
}
37033719

37043720
WRITE_ONCE(msk->write_seq, subflow->idsn);

net/mptcp/protocol.h

Lines changed: 8 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -1220,24 +1220,6 @@ static inline bool mptcp_check_fallback(const struct sock *sk)
12201220
return __mptcp_check_fallback(msk);
12211221
}
12221222

1223-
static inline bool __mptcp_try_fallback(struct mptcp_sock *msk)
1224-
{
1225-
if (__mptcp_check_fallback(msk)) {
1226-
pr_debug("TCP fallback already done (msk=%p)\n", msk);
1227-
return true;
1228-
}
1229-
spin_lock_bh(&msk->fallback_lock);
1230-
if (!msk->allow_infinite_fallback) {
1231-
spin_unlock_bh(&msk->fallback_lock);
1232-
return false;
1233-
}
1234-
1235-
msk->allow_subflows = false;
1236-
set_bit(MPTCP_FALLBACK_DONE, &msk->flags);
1237-
spin_unlock_bh(&msk->fallback_lock);
1238-
return true;
1239-
}
1240-
12411223
static inline bool __mptcp_has_initial_subflow(const struct mptcp_sock *msk)
12421224
{
12431225
struct sock *ssk = READ_ONCE(msk->first);
@@ -1247,14 +1229,16 @@ static inline bool __mptcp_has_initial_subflow(const struct mptcp_sock *msk)
12471229
TCPF_SYN_RECV | TCPF_LISTEN));
12481230
}
12491231

1250-
static inline bool mptcp_try_fallback(struct sock *ssk)
1232+
bool __mptcp_try_fallback(struct mptcp_sock *msk, int fb_mib);
1233+
1234+
static inline bool mptcp_try_fallback(struct sock *ssk, int fb_mib)
12511235
{
12521236
struct mptcp_subflow_context *subflow = mptcp_subflow_ctx(ssk);
12531237
struct sock *sk = subflow->conn;
12541238
struct mptcp_sock *msk;
12551239

12561240
msk = mptcp_sk(sk);
1257-
if (!__mptcp_try_fallback(msk))
1241+
if (!__mptcp_try_fallback(msk, fb_mib))
12581242
return false;
12591243
if (READ_ONCE(msk->snd_data_fin_enable) && !(ssk->sk_shutdown & SEND_SHUTDOWN)) {
12601244
gfp_t saved_allocation = ssk->sk_allocation;
@@ -1272,12 +1256,13 @@ static inline bool mptcp_try_fallback(struct sock *ssk)
12721256

12731257
#define pr_fallback(a) pr_debug("%s:fallback to TCP (msk=%p)\n", __func__, a)
12741258

1275-
static inline void mptcp_subflow_early_fallback(struct mptcp_sock *msk,
1276-
struct mptcp_subflow_context *subflow)
1259+
static inline void mptcp_early_fallback(struct mptcp_sock *msk,
1260+
struct mptcp_subflow_context *subflow,
1261+
int fb_mib)
12771262
{
12781263
pr_fallback(msk);
12791264
subflow->request_mptcp = 0;
1280-
WARN_ON_ONCE(!__mptcp_try_fallback(msk));
1265+
WARN_ON_ONCE(!__mptcp_try_fallback(msk, fb_mib));
12811266
}
12821267

12831268
static inline bool mptcp_check_infinite_map(struct sk_buff *skb)

net/mptcp/subflow.c

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -544,11 +544,13 @@ static void subflow_finish_connect(struct sock *sk, const struct sk_buff *skb)
544544
mptcp_get_options(skb, &mp_opt);
545545
if (subflow->request_mptcp) {
546546
if (!(mp_opt.suboptions & OPTION_MPTCP_MPC_SYNACK)) {
547-
if (!mptcp_try_fallback(sk))
547+
if (!mptcp_try_fallback(sk,
548+
MPTCP_MIB_MPCAPABLEACTIVEFALLBACK)) {
549+
MPTCP_INC_STATS(sock_net(sk),
550+
MPTCP_MIB_FALLBACKFAILED);
548551
goto do_reset;
552+
}
549553

550-
MPTCP_INC_STATS(sock_net(sk),
551-
MPTCP_MIB_MPCAPABLEACTIVEFALLBACK);
552554
pr_fallback(msk);
553555
goto fallback;
554556
}
@@ -1406,7 +1408,7 @@ static bool subflow_check_data_avail(struct sock *ssk)
14061408
return true;
14071409
}
14081410

1409-
if (!mptcp_try_fallback(ssk)) {
1411+
if (!mptcp_try_fallback(ssk, MPTCP_MIB_DSSFALLBACK)) {
14101412
/* fatal protocol error, close the socket.
14111413
* subflow_error_report() will introduce the appropriate barriers
14121414
*/
@@ -1859,7 +1861,7 @@ static void subflow_state_change(struct sock *sk)
18591861

18601862
msk = mptcp_sk(parent);
18611863
if (subflow_simultaneous_connect(sk)) {
1862-
WARN_ON_ONCE(!mptcp_try_fallback(sk));
1864+
WARN_ON_ONCE(!mptcp_try_fallback(sk, MPTCP_MIB_SIMULTCONNFALLBACK));
18631865
pr_fallback(msk);
18641866
subflow->conn_finished = 1;
18651867
mptcp_propagate_state(parent, sk, subflow, NULL);

0 commit comments

Comments
 (0)