forked from ~ljy/RK356X_SDK_RELEASE

hc
2023-12-09 b22da3d8526a935aa31e086e63f60ff3246cb61c
kernel/net/rds/rdma_transport.c
....@@ -43,6 +43,9 @@
4343 static struct rdma_cm_id *rds6_rdma_listen_id;
4444 #endif
4545
46
+/* Per IB specification 7.7.3, service level is a 4-bit field. */
47
+#define TOS_TO_SL(tos) ((tos) & 0xF)
48
+
4649 static int rds_rdma_cm_event_handler_cmn(struct rdma_cm_id *cm_id,
4750 struct rdma_cm_event *event,
4851 bool isv6)
....@@ -51,6 +54,8 @@
5154 struct rds_connection *conn = cm_id->context;
5255 struct rds_transport *trans;
5356 int ret = 0;
57
+ int *err;
58
+ u8 len;
5459
5560 rdsdebug("conn %p id %p handling event %u (%s)\n", conn, cm_id,
5661 event->event, rdma_event_msg(event->event));
....@@ -81,6 +86,7 @@
8186 break;
8287
8388 case RDMA_CM_EVENT_ADDR_RESOLVED:
89
+ rdma_set_service_type(cm_id, conn->c_tos);
8490 /* XXX do we need to clean up if this fails? */
8591 ret = rdma_resolve_route(cm_id,
8692 RDS_RDMA_RESOLVE_TIMEOUT_MS);
....@@ -94,21 +100,39 @@
94100 struct rds_ib_connection *ibic;
95101
96102 ibic = conn->c_transport_data;
97
- if (ibic && ibic->i_cm_id == cm_id)
103
+ if (ibic && ibic->i_cm_id == cm_id) {
104
+ cm_id->route.path_rec[0].sl =
105
+ TOS_TO_SL(conn->c_tos);
98106 ret = trans->cm_initiate_connect(cm_id, isv6);
99
- else
107
+ } else {
100108 rds_conn_drop(conn);
109
+ }
101110 }
102111 break;
103112
104113 case RDMA_CM_EVENT_ESTABLISHED:
105
- trans->cm_connect_complete(conn, event);
114
+ if (conn)
115
+ trans->cm_connect_complete(conn, event);
106116 break;
107117
108118 case RDMA_CM_EVENT_REJECTED:
119
+ if (!conn)
120
+ break;
121
+ err = (int *)rdma_consumer_reject_data(cm_id, event, &len);
122
+ if (!err ||
123
+ (err && len >= sizeof(*err) &&
124
+ ((*err) <= RDS_RDMA_REJ_INCOMPAT))) {
125
+ pr_warn("RDS/RDMA: conn <%pI6c, %pI6c> rejected, dropping connection\n",
126
+ &conn->c_laddr, &conn->c_faddr);
127
+
128
+ if (!conn->c_tos)
129
+ conn->c_proposed_version = RDS_PROTOCOL_COMPAT_VERSION;
130
+
131
+ rds_conn_drop(conn);
132
+ }
109133 rdsdebug("Connection rejected: %s\n",
110134 rdma_reject_msg(cm_id, event->status));
111
- /* FALLTHROUGH */
135
+ break;
112136 case RDMA_CM_EVENT_ADDR_ERROR:
113137 case RDMA_CM_EVENT_ROUTE_ERROR:
114138 case RDMA_CM_EVENT_CONNECT_ERROR:
....@@ -120,6 +144,8 @@
120144 break;
121145
122146 case RDMA_CM_EVENT_DISCONNECTED:
147
+ if (!conn)
148
+ break;
123149 rdsdebug("DISCONNECT event - dropping connection "
124150 "%pI6c->%pI6c\n", &conn->c_laddr,
125151 &conn->c_faddr);