hc
2024-10-22 8ac6c7a54ed1b98d142dce24b11c6de6a1e239a5
kernel/net/rds/connection.c
....@@ -84,7 +84,7 @@
8484 const struct in6_addr *laddr,
8585 const struct in6_addr *faddr,
8686 struct rds_transport *trans,
87
- int dev_if)
87
+ u8 tos, int dev_if)
8888 {
8989 struct rds_connection *conn, *ret = NULL;
9090
....@@ -92,6 +92,7 @@
9292 if (ipv6_addr_equal(&conn->c_faddr, faddr) &&
9393 ipv6_addr_equal(&conn->c_laddr, laddr) &&
9494 conn->c_trans == trans &&
95
+ conn->c_tos == tos &&
9596 net == rds_conn_net(conn) &&
9697 conn->c_dev_if == dev_if) {
9798 ret = conn;
....@@ -139,6 +140,7 @@
139140 atomic_set(&cp->cp_state, RDS_CONN_DOWN);
140141 cp->cp_send_gen = 0;
141142 cp->cp_reconnect_jiffies = 0;
143
+ cp->cp_conn->c_proposed_version = RDS_PROTOCOL_VERSION;
142144 INIT_DELAYED_WORK(&cp->cp_send_w, rds_send_worker);
143145 INIT_DELAYED_WORK(&cp->cp_recv_w, rds_recv_worker);
144146 INIT_DELAYED_WORK(&cp->cp_conn_w, rds_connect_worker);
....@@ -159,7 +161,7 @@
159161 const struct in6_addr *laddr,
160162 const struct in6_addr *faddr,
161163 struct rds_transport *trans,
162
- gfp_t gfp,
164
+ gfp_t gfp, u8 tos,
163165 int is_outgoing,
164166 int dev_if)
165167 {
....@@ -171,7 +173,7 @@
171173 int npaths = (trans->t_mp_capable ? RDS_MPATH_WORKERS : 1);
172174
173175 rcu_read_lock();
174
- conn = rds_conn_lookup(net, head, laddr, faddr, trans, dev_if);
176
+ conn = rds_conn_lookup(net, head, laddr, faddr, trans, tos, dev_if);
175177 if (conn &&
176178 conn->c_loopback &&
177179 conn->c_trans != &rds_loop_transport &&
....@@ -205,6 +207,7 @@
205207 conn->c_isv6 = !ipv6_addr_v4mapped(laddr);
206208 conn->c_faddr = *faddr;
207209 conn->c_dev_if = dev_if;
210
+ conn->c_tos = tos;
208211
209212 #if IS_ENABLED(CONFIG_IPV6)
210213 /* If the local address is link local, set c_bound_if to be the
....@@ -309,7 +312,7 @@
309312 struct rds_connection *found;
310313
311314 found = rds_conn_lookup(net, head, laddr, faddr, trans,
312
- dev_if);
315
+ tos, dev_if);
313316 if (found) {
314317 struct rds_conn_path *cp;
315318 int i;
....@@ -344,10 +347,10 @@
344347 struct rds_connection *rds_conn_create(struct net *net,
345348 const struct in6_addr *laddr,
346349 const struct in6_addr *faddr,
347
- struct rds_transport *trans, gfp_t gfp,
348
- int dev_if)
350
+ struct rds_transport *trans, u8 tos,
351
+ gfp_t gfp, int dev_if)
349352 {
350
- return __rds_conn_create(net, laddr, faddr, trans, gfp, 0, dev_if);
353
+ return __rds_conn_create(net, laddr, faddr, trans, gfp, tos, 0, dev_if);
351354 }
352355 EXPORT_SYMBOL_GPL(rds_conn_create);
353356
....@@ -355,9 +358,9 @@
355358 const struct in6_addr *laddr,
356359 const struct in6_addr *faddr,
357360 struct rds_transport *trans,
358
- gfp_t gfp, int dev_if)
361
+ u8 tos, gfp_t gfp, int dev_if)
359362 {
360
- return __rds_conn_create(net, laddr, faddr, trans, gfp, 1, dev_if);
363
+ return __rds_conn_create(net, laddr, faddr, trans, gfp, tos, 1, dev_if);
361364 }
362365 EXPORT_SYMBOL_GPL(rds_conn_create_outgoing);
363366
....@@ -745,6 +748,7 @@
745748 cinfo->next_rx_seq = cp->cp_next_rx_seq;
746749 cinfo->laddr = conn->c_laddr.s6_addr32[3];
747750 cinfo->faddr = conn->c_faddr.s6_addr32[3];
751
+ cinfo->tos = conn->c_tos;
748752 strncpy(cinfo->transport, conn->c_trans->t_name,
749753 sizeof(cinfo->transport));
750754 cinfo->flags = 0;
....@@ -913,6 +917,17 @@
913917 }
914918 EXPORT_SYMBOL_GPL(rds_conn_path_connect_if_down);
915919
920
+/* Check connectivity of all paths
921
+ */
922
+void rds_check_all_paths(struct rds_connection *conn)
923
+{
924
+ int i = 0;
925
+
926
+ do {
927
+ rds_conn_path_connect_if_down(&conn->c_path[i]);
928
+ } while (++i < conn->c_npaths);
929
+}
930
+
916931 void rds_conn_connect_if_down(struct rds_connection *conn)
917932 {
918933 WARN_ON(conn->c_trans->t_mp_capable);