1 // SPDX-License-Identifier: GPL-2.0
2 #include <kunit/test.h>
6 static struct mptcp_subflow_request_sock
*build_req_sock(struct kunit
*test
)
8 struct mptcp_subflow_request_sock
*req
;
10 req
= kunit_kzalloc(test
, sizeof(struct mptcp_subflow_request_sock
),
12 KUNIT_EXPECT_NOT_ERR_OR_NULL(test
, req
);
13 mptcp_token_init_request((struct request_sock
*)req
);
14 sock_net_set((struct sock
*)req
, &init_net
);
18 static void mptcp_token_test_req_basic(struct kunit
*test
)
20 struct mptcp_subflow_request_sock
*req
= build_req_sock(test
);
21 struct mptcp_sock
*null_msk
= NULL
;
23 KUNIT_ASSERT_EQ(test
, 0,
24 mptcp_token_new_request((struct request_sock
*)req
));
25 KUNIT_EXPECT_NE(test
, 0, (int)req
->token
);
26 KUNIT_EXPECT_PTR_EQ(test
, null_msk
, mptcp_token_get_sock(&init_net
, req
->token
));
29 mptcp_token_destroy_request((struct request_sock
*)req
);
32 static struct inet_connection_sock
*build_icsk(struct kunit
*test
)
34 struct inet_connection_sock
*icsk
;
36 icsk
= kunit_kzalloc(test
, sizeof(struct inet_connection_sock
),
38 KUNIT_EXPECT_NOT_ERR_OR_NULL(test
, icsk
);
42 static struct mptcp_subflow_context
*build_ctx(struct kunit
*test
)
44 struct mptcp_subflow_context
*ctx
;
46 ctx
= kunit_kzalloc(test
, sizeof(struct mptcp_subflow_context
),
48 KUNIT_EXPECT_NOT_ERR_OR_NULL(test
, ctx
);
52 static struct mptcp_sock
*build_msk(struct kunit
*test
)
54 struct mptcp_sock
*msk
;
57 msk
= kunit_kzalloc(test
, sizeof(struct mptcp_sock
), GFP_USER
);
58 KUNIT_EXPECT_NOT_ERR_OR_NULL(test
, msk
);
59 refcount_set(&((struct sock
*)msk
)->sk_refcnt
, 1);
60 sock_net_set((struct sock
*)msk
, &init_net
);
62 sk
= (struct sock
*)msk
;
64 /* be sure the token helpers can dereference sk->sk_prot */
65 sk
->sk_prot
= &tcp_prot
;
66 sk
->sk_protocol
= IPPROTO_MPTCP
;
71 static void mptcp_token_test_msk_basic(struct kunit
*test
)
73 struct inet_connection_sock
*icsk
= build_icsk(test
);
74 struct mptcp_subflow_context
*ctx
= build_ctx(test
);
75 struct mptcp_sock
*msk
= build_msk(test
);
76 struct mptcp_sock
*null_msk
= NULL
;
79 rcu_assign_pointer(icsk
->icsk_ulp_data
, ctx
);
80 ctx
->conn
= (struct sock
*)msk
;
81 sk
= (struct sock
*)msk
;
83 KUNIT_ASSERT_EQ(test
, 0,
84 mptcp_token_new_connect((struct sock
*)icsk
));
85 KUNIT_EXPECT_NE(test
, 0, (int)ctx
->token
);
86 KUNIT_EXPECT_EQ(test
, ctx
->token
, msk
->token
);
87 KUNIT_EXPECT_PTR_EQ(test
, msk
, mptcp_token_get_sock(&init_net
, ctx
->token
));
88 KUNIT_EXPECT_EQ(test
, 2, (int)refcount_read(&sk
->sk_refcnt
));
90 mptcp_token_destroy(msk
);
91 KUNIT_EXPECT_PTR_EQ(test
, null_msk
, mptcp_token_get_sock(&init_net
, ctx
->token
));
94 static void mptcp_token_test_accept(struct kunit
*test
)
96 struct mptcp_subflow_request_sock
*req
= build_req_sock(test
);
97 struct mptcp_sock
*msk
= build_msk(test
);
99 KUNIT_ASSERT_EQ(test
, 0,
100 mptcp_token_new_request((struct request_sock
*)req
));
101 msk
->token
= req
->token
;
102 mptcp_token_accept(req
, msk
);
103 KUNIT_EXPECT_PTR_EQ(test
, msk
, mptcp_token_get_sock(&init_net
, msk
->token
));
105 /* this is now a no-op */
106 mptcp_token_destroy_request((struct request_sock
*)req
);
107 KUNIT_EXPECT_PTR_EQ(test
, msk
, mptcp_token_get_sock(&init_net
, msk
->token
));
110 mptcp_token_destroy(msk
);
113 static void mptcp_token_test_destroyed(struct kunit
*test
)
115 struct mptcp_subflow_request_sock
*req
= build_req_sock(test
);
116 struct mptcp_sock
*msk
= build_msk(test
);
117 struct mptcp_sock
*null_msk
= NULL
;
120 sk
= (struct sock
*)msk
;
122 KUNIT_ASSERT_EQ(test
, 0,
123 mptcp_token_new_request((struct request_sock
*)req
));
124 msk
->token
= req
->token
;
125 mptcp_token_accept(req
, msk
);
127 /* simulate race on removal */
128 refcount_set(&sk
->sk_refcnt
, 0);
129 KUNIT_EXPECT_PTR_EQ(test
, null_msk
, mptcp_token_get_sock(&init_net
, msk
->token
));
132 mptcp_token_destroy(msk
);
135 static struct kunit_case mptcp_token_test_cases
[] = {
136 KUNIT_CASE(mptcp_token_test_req_basic
),
137 KUNIT_CASE(mptcp_token_test_msk_basic
),
138 KUNIT_CASE(mptcp_token_test_accept
),
139 KUNIT_CASE(mptcp_token_test_destroyed
),
143 static struct kunit_suite mptcp_token_suite
= {
144 .name
= "mptcp-token",
145 .test_cases
= mptcp_token_test_cases
,
148 kunit_test_suite(mptcp_token_suite
);
150 MODULE_LICENSE("GPL");
151 MODULE_DESCRIPTION("KUnit tests for MPTCP Token");