...
...
5
Gang Yan (2):
5
Gang Yan (2):
6
selftests: mptcp: Add a tool to get specific msk_info
6
selftests: mptcp: Add a tool to get specific msk_info
7
selftests: mptcp: add a test for mptcp_diag_dump_one
7
selftests: mptcp: add a test for mptcp_diag_dump_one
8
8
9
tools/testing/selftests/net/mptcp/Makefile | 2 +-
9
tools/testing/selftests/net/mptcp/Makefile | 2 +-
10
tools/testing/selftests/net/mptcp/diag.sh | 23 ++
10
tools/testing/selftests/net/mptcp/diag.sh | 27 ++
11
.../testing/selftests/net/mptcp/mptcp_diag.c | 235 ++++++++++++++++++
11
.../testing/selftests/net/mptcp/mptcp_diag.c | 258 ++++++++++++++++++
12
3 files changed, 259 insertions(+), 1 deletion(-)
12
3 files changed, 286 insertions(+), 1 deletion(-)
13
create mode 100644 tools/testing/selftests/net/mptcp/mptcp_diag.c
13
create mode 100644 tools/testing/selftests/net/mptcp/mptcp_diag.c
14
14
15
--
15
--
16
2.43.0
16
2.25.1
diff view generated by jsdifflib
...
...
5
the msk.
5
the msk.
6
6
7
Signed-off-by: Gang Yan <yangang@kylinos.cn>
7
Signed-off-by: Gang Yan <yangang@kylinos.cn>
8
---
8
---
9
tools/testing/selftests/net/mptcp/Makefile | 2 +-
9
tools/testing/selftests/net/mptcp/Makefile | 2 +-
10
.../testing/selftests/net/mptcp/mptcp_diag.c | 235 ++++++++++++++++++
10
.../testing/selftests/net/mptcp/mptcp_diag.c | 258 ++++++++++++++++++
11
2 files changed, 236 insertions(+), 1 deletion(-)
11
2 files changed, 259 insertions(+), 1 deletion(-)
12
create mode 100644 tools/testing/selftests/net/mptcp/mptcp_diag.c
12
create mode 100644 tools/testing/selftests/net/mptcp/mptcp_diag.c
13
13
14
diff --git a/tools/testing/selftests/net/mptcp/Makefile b/tools/testing/selftests/net/mptcp/Makefile
14
diff --git a/tools/testing/selftests/net/mptcp/Makefile b/tools/testing/selftests/net/mptcp/Makefile
15
index XXXXXXX..XXXXXXX 100644
15
index XXXXXXX..XXXXXXX 100644
16
--- a/tools/testing/selftests/net/mptcp/Makefile
16
--- a/tools/testing/selftests/net/mptcp/Makefile
...
...
29
index XXXXXXX..XXXXXXX
29
index XXXXXXX..XXXXXXX
30
--- /dev/null
30
--- /dev/null
31
+++ b/tools/testing/selftests/net/mptcp/mptcp_diag.c
31
+++ b/tools/testing/selftests/net/mptcp/mptcp_diag.c
32
@@ -XXX,XX +XXX,XX @@
32
@@ -XXX,XX +XXX,XX @@
33
+// SPDX-License-Identifier: GPL-2.0
33
+// SPDX-License-Identifier: GPL-2.0
34
+/* Copyright (c) 2025, Kylin Software*/
34
+/* Copyright (c) 2025, Kylin Software */
35
+
35
+
36
+#include <linux/sock_diag.h>
36
+#include <linux/sock_diag.h>
37
+#include <linux/rtnetlink.h>
37
+#include <linux/rtnetlink.h>
38
+#include <linux/inet_diag.h>
38
+#include <linux/inet_diag.h>
39
+#include <linux/netlink.h>
39
+#include <linux/netlink.h>
...
...
143
+        break;
143
+        break;
144
+    }
144
+    }
145
+}
145
+}
146
+
146
+
147
+static void parse_rtattr_flags(struct rtattr *tb[], int max, struct rtattr *rta,
147
+static void parse_rtattr_flags(struct rtattr *tb[], int max, struct rtattr *rta,
148
+         int len, unsigned short flags)
148
+             int len, unsigned short flags)
149
+{
149
+{
150
+    unsigned short type;
150
+    unsigned short type;
151
+
151
+
152
+    memset(tb, 0, sizeof(struct rtattr *) * (max + 1));
152
+    memset(tb, 0, sizeof(struct rtattr *) * (max + 1));
153
+    while (RTA_OK(rta, len)) {
153
+    while (RTA_OK(rta, len)) {
154
+        type = rta->rta_type & ~flags;
154
+        type = rta->rta_type & ~flags;
155
+        if ((type <= max) && (!tb[type]))
155
+        if (type <= max && !tb[type])
156
+            tb[type] = rta;
156
+            tb[type] = rta;
157
+        rta = RTA_NEXT(rta, len);
157
+        rta = RTA_NEXT(rta, len);
158
+    }
158
+    }
159
+}
159
+}
160
+
160
+
161
+static struct mptcp_info *parse_nlmsg(struct nlmsghdr *nlh)
161
+static void print_info_msg(struct mptcp_info *info)
162
+{
163
+    printf("Token & Flags\n");
164
+    printf("token:     %x\n", info->mptcpi_token);
165
+    printf("flags:     %x\n", info->mptcpi_flags);
166
+    printf("csum_enabled: %u\n", info->mptcpi_csum_enabled);
167
+
168
+    printf("\nBasic Info\n");
169
+    printf("subflows: %-5u subflows_max: %u\n",
170
+     info->mptcpi_subflows,
171
+     info->mptcpi_subflows_max);
172
+    printf("local_addr_used: %-5u local_addr_max: %u\n",
173
+     info->mptcpi_local_addr_used,
174
+     info->mptcpi_local_addr_max);
175
+    printf("add_addr_signal: %-5u add_addr_accepted: %u\n",
176
+     info->mptcpi_add_addr_signal,
177
+     info->mptcpi_add_addr_accepted);
178
+    printf("add_addr_signal_max: %-5u add_addr_accepted_max: %u\n",
179
+     info->mptcpi_add_addr_signal_max,
180
+     info->mptcpi_add_addr_accepted_max);
181
+
182
+    printf("\nTransmission Info\n");
183
+    printf("write_seq:     %llx\n", info->mptcpi_write_seq);
184
+    printf("snd_una:     %llx\n", info->mptcpi_snd_una);
185
+    printf("rcv_nxt:     %llx\n", info->mptcpi_rcv_nxt);
186
+    printf("retransmits:     %u\n", info->mptcpi_retransmits);
187
+    printf("retransmit bytes: %llu\n", info->mptcpi_bytes_retrans);
188
+    printf("bytes_sent:     %llu\n", info->mptcpi_bytes_sent);
189
+    printf("bytes_received: %llu\n", info->mptcpi_bytes_received);
190
+    printf("bytes_acked:     %llu\n", info->mptcpi_bytes_acked);
191
+}
192
+
193
+static void parse_nlmsg(struct nlmsghdr *nlh)
162
+{
194
+{
163
+    struct inet_diag_msg *r = NLMSG_DATA(nlh);
195
+    struct inet_diag_msg *r = NLMSG_DATA(nlh);
164
+    struct rtattr *tb[INET_DIAG_MAX+1];
196
+    struct rtattr *tb[INET_DIAG_MAX + 1];
165
+    struct mptcp_info *info;
197
+    struct mptcp_info *info;
166
+
198
+
167
+    parse_rtattr_flags(tb, INET_DIAG_MAX, (struct rtattr *)(r+1),
199
+    parse_rtattr_flags(tb, INET_DIAG_MAX, (struct rtattr *)(r + 1),
168
+             nlh->nlmsg_len - NLMSG_LENGTH(sizeof(*r)),
200
+             nlh->nlmsg_len - NLMSG_LENGTH(sizeof(*r)),
169
+             NLA_F_NESTED);
201
+             NLA_F_NESTED);
170
+
202
+
171
+    if (tb[INET_DIAG_INFO]) {
203
+    if (tb[INET_DIAG_INFO]) {
172
+        info = RTA_DATA(tb[INET_DIAG_INFO]);
204
+        info = RTA_DATA(tb[INET_DIAG_INFO]);
173
+        return info;
205
+        print_info_msg(info);
174
+    }
206
+    }
175
+
207
+}
176
+    die_perror("Has no INET_DIAG_INFO");
208
+
177
+    return info;
209
+static void recv_nlmsg(int fd, struct nlmsghdr *nlh)
178
+}
179
+
180
+static struct mptcp_info *recv_nlmsg(int fd, struct nlmsghdr *nlh)
181
+{
210
+{
182
+    char rcv_buff[8192];
211
+    char rcv_buff[8192];
183
+    struct sockaddr_nl rcv_nladdr = {
212
+    struct sockaddr_nl rcv_nladdr = {
184
+        .nl_family = AF_NETLINK
213
+        .nl_family = AF_NETLINK
185
+    };
214
+    };
...
...
191
+        .msg_name = &rcv_nladdr,
220
+        .msg_name = &rcv_nladdr,
192
+        .msg_namelen = sizeof(rcv_nladdr),
221
+        .msg_namelen = sizeof(rcv_nladdr),
193
+        .msg_iov = &rcv_iov,
222
+        .msg_iov = &rcv_iov,
194
+        .msg_iovlen = 1
223
+        .msg_iovlen = 1
195
+    };
224
+    };
196
+    struct mptcp_info *info = NULL;
197
+    int len;
225
+    int len;
198
+
226
+
199
+    len = recvmsg(fd, &rcv_msg, 0);
227
+    len = recvmsg(fd, &rcv_msg, 0);
200
+    nlh = (struct nlmsghdr *)rcv_buff;
228
+    nlh = (struct nlmsghdr *)rcv_buff;
201
+
229
+
...
...
205
+            break;
233
+            break;
206
+        } else if (nlh->nlmsg_type == NLMSG_ERROR) {
234
+        } else if (nlh->nlmsg_type == NLMSG_ERROR) {
207
+            struct nlmsgerr *err;
235
+            struct nlmsgerr *err;
208
+
236
+
209
+            err = (struct nlmsgerr *)NLMSG_DATA(nlh);
237
+            err = (struct nlmsgerr *)NLMSG_DATA(nlh);
210
+            printf("Error %d:%s\n", -(err->error), strerror(-(err->error)));
238
+            printf("Error %d:%s\n",
211
+            break;
239
+             -(err->error), strerror(-(err->error)));
212
+        }
240
+            break;
213
+        info = parse_nlmsg(nlh);
241
+        }
242
+        parse_nlmsg(nlh);
214
+        nlh = NLMSG_NEXT(nlh, len);
243
+        nlh = NLMSG_NEXT(nlh, len);
215
+    }
244
+    }
216
+    close(fd);
245
+}
217
+    return info;
246
+
218
+}
247
+static void get_mptcpinfo(__u32 token)
219
+
220
+static struct mptcp_info *get_mptcpinfo(__u32 token)
221
+{
248
+{
222
+    struct nlmsghdr *nlh = NULL;
249
+    struct nlmsghdr *nlh = NULL;
223
+    int fd;
250
+    int fd;
224
+
251
+
225
+    fd = socket(AF_NETLINK, SOCK_RAW, NETLINK_SOCK_DIAG);
252
+    fd = socket(AF_NETLINK, SOCK_RAW, NETLINK_SOCK_DIAG);
226
+    if (fd < 0)
253
+    if (fd < 0)
227
+        die_perror("Netlink socket");
254
+        die_perror("Netlink socket");
228
+
255
+
229
+    send_query(fd, token);
256
+    send_query(fd, token);
230
+    return recv_nlmsg(fd, nlh);
257
+    recv_nlmsg(fd, nlh);
258
+
259
+    close(fd);
231
+}
260
+}
232
+
261
+
233
+static void parse_opts(int argc, char **argv, __u32 *target_token)
262
+static void parse_opts(int argc, char **argv, __u32 *target_token)
234
+{
263
+{
235
+    int c;
264
+    int c;
236
+
265
+
237
+    while ((c = getopt(argc, argv, "ht:")) != -1) {
266
+    while ((c = getopt(argc, argv, "ht:")) != -1) {
238
+        switch (c) {
267
+        switch (c) {
239
+        case 'h':
268
+        case 'h':
240
+            die_usage(1);
269
+            die_usage(0);
241
+            break;
270
+            break;
242
+        case 't':
271
+        case 't':
243
+            sscanf(optarg, "%x", target_token);
272
+            sscanf(optarg, "%x", target_token);
244
+            break;
273
+            break;
245
+        default:
274
+        default:
...
...
249
+    }
278
+    }
250
+}
279
+}
251
+
280
+
252
+int main(int argc, char *argv[])
281
+int main(int argc, char *argv[])
253
+{
282
+{
254
+    struct mptcp_info *info = NULL;
255
+    __u32 target_token;
283
+    __u32 target_token;
256
+
284
+
257
+    parse_opts(argc, argv, &target_token);
285
+    parse_opts(argc, argv, &target_token);
258
+    info = get_mptcpinfo(target_token);
286
+    get_mptcpinfo(target_token);
259
+
260
+    if (info)
261
+        printf("token:%x\n", info->mptcpi_token);
262
+    else
263
+        perror("No Such msk using this token!\n");
264
+
287
+
265
+    return 0;
288
+    return 0;
266
+}
289
+}
267
+
290
+
268
--
291
--
269
2.43.0
292
2.25.1
diff view generated by jsdifflib
...
...
4
to verify if the correct token is returned.
4
to verify if the correct token is returned.
5
5
6
Closes: https://github.com/multipath-tcp/mptcp_net-next/issues/524
6
Closes: https://github.com/multipath-tcp/mptcp_net-next/issues/524
7
Signed-off-by: Gang Yan <yangang@kylinos.cn>
7
Signed-off-by: Gang Yan <yangang@kylinos.cn>
8
---
8
---
9
tools/testing/selftests/net/mptcp/diag.sh | 23 +++++++++++++++++++++++
9
tools/testing/selftests/net/mptcp/diag.sh | 27 +++++++++++++++++++++++
10
1 file changed, 23 insertions(+)
10
1 file changed, 27 insertions(+)
11
11
12
diff --git a/tools/testing/selftests/net/mptcp/diag.sh b/tools/testing/selftests/net/mptcp/diag.sh
12
diff --git a/tools/testing/selftests/net/mptcp/diag.sh b/tools/testing/selftests/net/mptcp/diag.sh
13
index XXXXXXX..XXXXXXX 100755
13
index XXXXXXX..XXXXXXX 100755
14
--- a/tools/testing/selftests/net/mptcp/diag.sh
14
--- a/tools/testing/selftests/net/mptcp/diag.sh
15
+++ b/tools/testing/selftests/net/mptcp/diag.sh
15
+++ b/tools/testing/selftests/net/mptcp/diag.sh
16
@@ -XXX,XX +XXX,XX @@ chk_msk_cestab()
16
@@ -XXX,XX +XXX,XX @@ chk_msk_cestab()
17
         "${expected}" "${msg}" ""
17
         "${expected}" "${msg}" ""
18
}
18
}
19
19
20
+chk_dumpone()
20
+chk_dump_one()
21
+{
21
+{
22
+    local ss_token="$(ss -inmHMN $ns | grep 'token:' |\
22
+    local ss_token
23
+             head -n 1 |\
23
+    local token
24
+             sed 's/.*token:\([0-9a-f]*\).*/\1/')"
24
+    local msg
25
+    local token="$(ip netns exec $ns ./mptcp_diag -t $ss_token |\
25
+
26
+         grep 'token:' |\
26
+    ss_token="$(ss -inmHMN $ns | grep 'token:' |\
27
+         sed 's/.*token:\([0-9a-f]*\).*/\1/')"
27
+         head -n 1 |\
28
+    local msg="...chk dumpone"
28
+         sed 's/.*token:\([0-9a-f]*\).*/\1/')"
29
+
30
+    token="$(ip netns exec $ns ./mptcp_diag -t $ss_token |\
31
+         awk -F':[ \t]+' '/^token/ {print $2}')"
32
+
33
+    msg="....chk dump_one"
29
+
34
+
30
+    mptcp_lib_print_title "$msg"
35
+    mptcp_lib_print_title "$msg"
31
+ if [ "$ss_token" != "$token" ]; then
36
+    if [ "$ss_token" != "$token" ]; then
32
+        mptcp_lib_pr_fail "expected $ss_token found $token"
37
+        mptcp_lib_pr_fail "expected $ss_token found $token"
33
+        mptcp_lib_result_fail "${msg}"
38
+        mptcp_lib_result_fail "${msg}"
34
+        ret=${KSFT_FAIL}
39
+        ret=${KSFT_FAIL}
35
+    else
40
+    else
36
+ mptcp_lib_pr_ok
41
+        mptcp_lib_pr_ok
37
+ mptcp_lib_result_pass "${msg}"
42
+        mptcp_lib_result_pass "${msg}"
38
+    fi
43
+    fi
39
+
40
+}
44
+}
41
+
45
+
42
msk_info_get_value()
46
msk_info_get_value()
43
{
47
{
44
    local port="${1}"
48
    local port="${1}"
45
@@ -XXX,XX +XXX,XX @@ chk_msk_remote_key_nr 2 "....chk remote_key"
49
@@ -XXX,XX +XXX,XX @@ chk_msk_remote_key_nr 2 "....chk remote_key"
46
chk_msk_fallback_nr 0 "....chk no fallback"
50
chk_msk_fallback_nr 0 "....chk no fallback"
47
chk_msk_inuse 2
51
chk_msk_inuse 2
48
chk_msk_cestab 2
52
chk_msk_cestab 2
49
+chk_dumpone
53
+chk_dump_one
50
flush_pids
54
flush_pids
51
55
52
chk_msk_inuse 0 "2->0"
56
chk_msk_inuse 0 "2->0"
53
--
57
--
54
2.43.0
58
2.25.1
diff view generated by jsdifflib