Skip to content

Commit 74c7dfb

Browse files
Paolo Abenidavem330
authored andcommitted
mptcp: consolidate in_opt sub-options fields in a bitmask
This makes input options processing more consistent with output ones and will simplify the next patch. Also avoid clearing the suboption field after processing it, since it's not needed. Signed-off-by: Paolo Abeni <[email protected]> Signed-off-by: Mat Martineau <[email protected]> Signed-off-by: David S. Miller <[email protected]>
1 parent a086aeb commit 74c7dfb

File tree

4 files changed

+63
-73
lines changed

4 files changed

+63
-73
lines changed

net/mptcp/options.c

Lines changed: 30 additions & 44 deletions
Original file line numberDiff line numberDiff line change
@@ -81,11 +81,11 @@ static void mptcp_parse_option(const struct sk_buff *skb,
8181
* is if both hosts in their SYNs set A=0."
8282
*/
8383
if (flags & MPTCP_CAP_CHECKSUM_REQD)
84-
mp_opt->csum_reqd = 1;
84+
mp_opt->suboptions |= OPTION_MPTCP_CSUMREQD;
8585

8686
mp_opt->deny_join_id0 = !!(flags & MPTCP_CAP_DENY_JOIN_ID0);
8787

88-
mp_opt->mp_capable = 1;
88+
mp_opt->suboptions |= OPTIONS_MPTCP_MPC;
8989
if (opsize >= TCPOLEN_MPTCP_MPC_SYNACK) {
9090
mp_opt->sndr_key = get_unaligned_be64(ptr);
9191
ptr += 8;
@@ -100,15 +100,15 @@ static void mptcp_parse_option(const struct sk_buff *skb,
100100
* equivalent to those in a DSS option and can be used
101101
* interchangeably."
102102
*/
103-
mp_opt->dss = 1;
103+
mp_opt->suboptions |= OPTION_MPTCP_DSS;
104104
mp_opt->use_map = 1;
105105
mp_opt->mpc_map = 1;
106106
mp_opt->data_len = get_unaligned_be16(ptr);
107107
ptr += 2;
108108
}
109109
if (opsize == TCPOLEN_MPTCP_MPC_ACK_DATA_CSUM) {
110110
mp_opt->csum = (__force __sum16)get_unaligned_be16(ptr);
111-
mp_opt->csum_reqd = 1;
111+
mp_opt->suboptions |= OPTION_MPTCP_CSUMREQD;
112112
ptr += 2;
113113
}
114114
pr_debug("MP_CAPABLE version=%x, flags=%x, optlen=%d sndr=%llu, rcvr=%llu len=%d csum=%u",
@@ -117,7 +117,7 @@ static void mptcp_parse_option(const struct sk_buff *skb,
117117
break;
118118

119119
case MPTCPOPT_MP_JOIN:
120-
mp_opt->mp_join = 1;
120+
mp_opt->suboptions |= OPTIONS_MPTCP_MPJ;
121121
if (opsize == TCPOLEN_MPTCP_MPJ_SYN) {
122122
mp_opt->backup = *ptr++ & MPTCPOPT_BACKUP;
123123
mp_opt->join_id = *ptr++;
@@ -143,7 +143,7 @@ static void mptcp_parse_option(const struct sk_buff *skb,
143143
memcpy(mp_opt->hmac, ptr, MPTCPOPT_HMAC_LEN);
144144
pr_debug("MP_JOIN hmac");
145145
} else {
146-
mp_opt->mp_join = 0;
146+
mp_opt->suboptions &= ~OPTIONS_MPTCP_MPJ;
147147
}
148148
break;
149149

@@ -191,8 +191,7 @@ static void mptcp_parse_option(const struct sk_buff *skb,
191191
opsize != expected_opsize + TCPOLEN_MPTCP_DSS_CHECKSUM)
192192
break;
193193

194-
mp_opt->dss = 1;
195-
194+
mp_opt->suboptions |= OPTION_MPTCP_DSS;
196195
if (mp_opt->use_ack) {
197196
if (mp_opt->ack64) {
198197
mp_opt->data_ack = get_unaligned_be64(ptr);
@@ -221,14 +220,15 @@ static void mptcp_parse_option(const struct sk_buff *skb,
221220
ptr += 2;
222221

223222
if (opsize == expected_opsize + TCPOLEN_MPTCP_DSS_CHECKSUM) {
224-
mp_opt->csum_reqd = 1;
223+
mp_opt->suboptions |= OPTION_MPTCP_CSUMREQD;
225224
mp_opt->csum = (__force __sum16)get_unaligned_be16(ptr);
226225
ptr += 2;
227226
}
228227

229228
pr_debug("data_seq=%llu subflow_seq=%u data_len=%u csum=%d:%u",
230229
mp_opt->data_seq, mp_opt->subflow_seq,
231-
mp_opt->data_len, mp_opt->csum_reqd, mp_opt->csum);
230+
mp_opt->data_len, !!(mp_opt->suboptions & OPTION_MPTCP_CSUMREQD),
231+
mp_opt->csum);
232232
}
233233

234234
break;
@@ -259,7 +259,7 @@ static void mptcp_parse_option(const struct sk_buff *skb,
259259
break;
260260
}
261261

262-
mp_opt->add_addr = 1;
262+
mp_opt->suboptions |= OPTION_MPTCP_ADD_ADDR;
263263
mp_opt->addr.id = *ptr++;
264264
mp_opt->addr.port = 0;
265265
mp_opt->ahmac = 0;
@@ -299,7 +299,7 @@ static void mptcp_parse_option(const struct sk_buff *skb,
299299

300300
ptr++;
301301

302-
mp_opt->rm_addr = 1;
302+
mp_opt->suboptions |= OPTION_MPTCP_RM_ADDR;
303303
mp_opt->rm_list.nr = opsize - TCPOLEN_MPTCP_RM_ADDR_BASE;
304304
for (i = 0; i < mp_opt->rm_list.nr; i++)
305305
mp_opt->rm_list.ids[i] = *ptr++;
@@ -310,7 +310,7 @@ static void mptcp_parse_option(const struct sk_buff *skb,
310310
if (opsize != TCPOLEN_MPTCP_PRIO)
311311
break;
312312

313-
mp_opt->mp_prio = 1;
313+
mp_opt->suboptions |= OPTION_MPTCP_PRIO;
314314
mp_opt->backup = *ptr++ & MPTCP_PRIO_BKUP;
315315
pr_debug("MP_PRIO: prio=%d", mp_opt->backup);
316316
break;
@@ -322,7 +322,7 @@ static void mptcp_parse_option(const struct sk_buff *skb,
322322
ptr += 2;
323323
mp_opt->rcvr_key = get_unaligned_be64(ptr);
324324
ptr += 8;
325-
mp_opt->fastclose = 1;
325+
mp_opt->suboptions |= OPTION_MPTCP_FASTCLOSE;
326326
break;
327327

328328
case MPTCPOPT_RST:
@@ -331,7 +331,8 @@ static void mptcp_parse_option(const struct sk_buff *skb,
331331

332332
if (!(TCP_SKB_CB(skb)->tcp_flags & TCPHDR_RST))
333333
break;
334-
mp_opt->reset = 1;
334+
335+
mp_opt->suboptions |= OPTION_MPTCP_RST;
335336
flags = *ptr++;
336337
mp_opt->reset_transient = flags & MPTCP_RST_TRANSIENT;
337338
mp_opt->reset_reason = *ptr;
@@ -342,7 +343,7 @@ static void mptcp_parse_option(const struct sk_buff *skb,
342343
break;
343344

344345
ptr += 2;
345-
mp_opt->mp_fail = 1;
346+
mp_opt->suboptions |= OPTION_MPTCP_FAIL;
346347
mp_opt->fail_seq = get_unaligned_be64(ptr);
347348
pr_debug("MP_FAIL: data_seq=%llu", mp_opt->fail_seq);
348349
break;
@@ -361,16 +362,7 @@ void mptcp_get_options(const struct sock *sk,
361362
int length;
362363

363364
/* initialize option status */
364-
mp_opt->mp_capable = 0;
365-
mp_opt->mp_join = 0;
366-
mp_opt->add_addr = 0;
367-
mp_opt->fastclose = 0;
368-
mp_opt->rm_addr = 0;
369-
mp_opt->dss = 0;
370-
mp_opt->mp_prio = 0;
371-
mp_opt->reset = 0;
372-
mp_opt->csum_reqd = 0;
373-
mp_opt->mp_fail = 0;
365+
mp_opt->suboptions = 0;
374366

375367
length = (th->doff * 4) - sizeof(struct tcphdr);
376368
ptr = (const unsigned char *)(th + 1);
@@ -924,7 +916,7 @@ static bool check_fully_established(struct mptcp_sock *msk, struct sock *ssk,
924916
*/
925917
if (TCP_SKB_CB(skb)->seq == subflow->ssn_offset + 1 &&
926918
TCP_SKB_CB(skb)->end_seq == TCP_SKB_CB(skb)->seq &&
927-
subflow->mp_join && mp_opt->mp_join &&
919+
subflow->mp_join && (mp_opt->suboptions & OPTIONS_MPTCP_MPJ) &&
928920
READ_ONCE(msk->pm.server_side))
929921
tcp_send_ack(ssk);
930922
goto fully_established;
@@ -941,8 +933,8 @@ static bool check_fully_established(struct mptcp_sock *msk, struct sock *ssk,
941933
return subflow->mp_capable;
942934
}
943935

944-
if ((mp_opt->dss && mp_opt->use_ack) ||
945-
(mp_opt->add_addr && !mp_opt->echo)) {
936+
if (((mp_opt->suboptions & OPTION_MPTCP_DSS) && mp_opt->use_ack) ||
937+
((mp_opt->suboptions & OPTION_MPTCP_ADD_ADDR) && !mp_opt->echo)) {
946938
/* subflows are fully established as soon as we get any
947939
* additional ack, including ADD_ADDR.
948940
*/
@@ -955,7 +947,7 @@ static bool check_fully_established(struct mptcp_sock *msk, struct sock *ssk,
955947
* then fallback to TCP. Fallback scenarios requires a reset for
956948
* MP_JOIN subflows.
957949
*/
958-
if (!mp_opt->mp_capable) {
950+
if (!(mp_opt->suboptions & OPTIONS_MPTCP_MPC)) {
959951
if (subflow->mp_join)
960952
goto reset;
961953
subflow->mp_capable = 0;
@@ -1119,13 +1111,13 @@ bool mptcp_incoming_options(struct sock *sk, struct sk_buff *skb)
11191111
if (!check_fully_established(msk, sk, subflow, skb, &mp_opt))
11201112
return sk->sk_state != TCP_CLOSE;
11211113

1122-
if (mp_opt.fastclose &&
1114+
if ((mp_opt.suboptions & OPTION_MPTCP_FASTCLOSE) &&
11231115
msk->local_key == mp_opt.rcvr_key) {
11241116
WRITE_ONCE(msk->rcv_fastclose, true);
11251117
mptcp_schedule_work((struct sock *)msk);
11261118
}
11271119

1128-
if (mp_opt.add_addr && add_addr_hmac_valid(msk, &mp_opt)) {
1120+
if ((mp_opt.suboptions & OPTION_MPTCP_ADD_ADDR) && add_addr_hmac_valid(msk, &mp_opt)) {
11291121
if (!mp_opt.echo) {
11301122
mptcp_pm_add_addr_received(msk, &mp_opt.addr);
11311123
MPTCP_INC_STATS(sock_net(sk), MPTCP_MIB_ADDADDR);
@@ -1137,34 +1129,28 @@ bool mptcp_incoming_options(struct sock *sk, struct sk_buff *skb)
11371129

11381130
if (mp_opt.addr.port)
11391131
MPTCP_INC_STATS(sock_net(sk), MPTCP_MIB_PORTADD);
1140-
1141-
mp_opt.add_addr = 0;
11421132
}
11431133

1144-
if (mp_opt.rm_addr) {
1134+
if (mp_opt.suboptions & OPTION_MPTCP_RM_ADDR)
11451135
mptcp_pm_rm_addr_received(msk, &mp_opt.rm_list);
1146-
mp_opt.rm_addr = 0;
1147-
}
11481136

1149-
if (mp_opt.mp_prio) {
1137+
if (mp_opt.suboptions & OPTION_MPTCP_PRIO) {
11501138
mptcp_pm_mp_prio_received(sk, mp_opt.backup);
11511139
MPTCP_INC_STATS(sock_net(sk), MPTCP_MIB_MPPRIORX);
1152-
mp_opt.mp_prio = 0;
11531140
}
11541141

1155-
if (mp_opt.mp_fail) {
1142+
if (mp_opt.suboptions & OPTION_MPTCP_FAIL) {
11561143
mptcp_pm_mp_fail_received(sk, mp_opt.fail_seq);
11571144
MPTCP_INC_STATS(sock_net(sk), MPTCP_MIB_MPFAILRX);
1158-
mp_opt.mp_fail = 0;
11591145
}
11601146

1161-
if (mp_opt.reset) {
1147+
if (mp_opt.suboptions & OPTION_MPTCP_RST) {
11621148
subflow->reset_seen = 1;
11631149
subflow->reset_reason = mp_opt.reset_reason;
11641150
subflow->reset_transient = mp_opt.reset_transient;
11651151
}
11661152

1167-
if (!mp_opt.dss)
1153+
if (!(mp_opt.suboptions & OPTION_MPTCP_DSS))
11681154
return true;
11691155

11701156
/* we can't wait for recvmsg() to update the ack_seq, otherwise
@@ -1213,7 +1199,7 @@ bool mptcp_incoming_options(struct sock *sk, struct sk_buff *skb)
12131199
}
12141200
mpext->data_len = mp_opt.data_len;
12151201
mpext->use_map = 1;
1216-
mpext->csum_reqd = mp_opt.csum_reqd;
1202+
mpext->csum_reqd = !!(mp_opt.suboptions & OPTION_MPTCP_CSUMREQD);
12171203

12181204
if (mpext->csum_reqd)
12191205
mpext->csum = mp_opt.csum;

net/mptcp/protocol.c

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2832,7 +2832,7 @@ struct sock *mptcp_sk_clone(const struct sock *sk,
28322832
msk->token = subflow_req->token;
28332833
msk->subflow = NULL;
28342834
WRITE_ONCE(msk->fully_established, false);
2835-
if (mp_opt->csum_reqd)
2835+
if (mp_opt->suboptions & OPTION_MPTCP_CSUMREQD)
28362836
WRITE_ONCE(msk->csum_enabled, true);
28372837

28382838
msk->write_seq = subflow_req->idsn + 1;
@@ -2841,7 +2841,7 @@ struct sock *mptcp_sk_clone(const struct sock *sk,
28412841
msk->wnd_end = msk->snd_nxt + req->rsk_rcv_wnd;
28422842
msk->setsockopt_seq = mptcp_sk(sk)->setsockopt_seq;
28432843

2844-
if (mp_opt->mp_capable) {
2844+
if (mp_opt->suboptions & OPTIONS_MPTCP_MPC) {
28452845
msk->can_ack = true;
28462846
msk->remote_key = mp_opt->sndr_key;
28472847
mptcp_crypto_key_sha(msk->remote_key, NULL, &ack_seq);

net/mptcp/protocol.h

Lines changed: 8 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,13 @@
2929
#define OPTION_MPTCP_DSS BIT(11)
3030
#define OPTION_MPTCP_FAIL BIT(12)
3131

32+
#define OPTION_MPTCP_CSUMREQD BIT(13)
33+
34+
#define OPTIONS_MPTCP_MPC (OPTION_MPTCP_MPC_SYN | OPTION_MPTCP_MPC_SYNACK | \
35+
OPTION_MPTCP_MPC_ACK)
36+
#define OPTIONS_MPTCP_MPJ (OPTION_MPTCP_MPJ_SYN | OPTION_MPTCP_MPJ_SYNACK | \
37+
OPTION_MPTCP_MPJ_SYNACK)
38+
3239
/* MPTCP option subtypes */
3340
#define MPTCPOPT_MP_CAPABLE 0
3441
#define MPTCPOPT_MP_JOIN 1
@@ -132,16 +139,7 @@ struct mptcp_options_received {
132139
u32 subflow_seq;
133140
u16 data_len;
134141
__sum16 csum;
135-
u16 mp_capable : 1,
136-
mp_join : 1,
137-
fastclose : 1,
138-
reset : 1,
139-
dss : 1,
140-
add_addr : 1,
141-
rm_addr : 1,
142-
mp_prio : 1,
143-
csum_reqd : 1,
144-
mp_fail : 1;
142+
u16 suboptions;
145143
u32 token;
146144
u32 nonce;
147145
u16 use_map:1,

0 commit comments

Comments
 (0)