aboutsummaryrefslogtreecommitdiffstats
path: root/net/rxrpc/ar-accept.c
diff options
context:
space:
mode:
Diffstat (limited to 'net/rxrpc/ar-accept.c')
-rw-r--r--net/rxrpc/ar-accept.c56
1 files changed, 31 insertions, 25 deletions
diff --git a/net/rxrpc/ar-accept.c b/net/rxrpc/ar-accept.c
index 6d79310fcaae..277731a5e67a 100644
--- a/net/rxrpc/ar-accept.c
+++ b/net/rxrpc/ar-accept.c
@@ -27,7 +27,7 @@
27 * generate a connection-level abort 27 * generate a connection-level abort
28 */ 28 */
29static int rxrpc_busy(struct rxrpc_local *local, struct sockaddr_rxrpc *srx, 29static int rxrpc_busy(struct rxrpc_local *local, struct sockaddr_rxrpc *srx,
30 struct rxrpc_header *hdr) 30 struct rxrpc_wire_header *whdr)
31{ 31{
32 struct msghdr msg; 32 struct msghdr msg;
33 struct kvec iov[1]; 33 struct kvec iov[1];
@@ -36,25 +36,21 @@ static int rxrpc_busy(struct rxrpc_local *local, struct sockaddr_rxrpc *srx,
36 36
37 _enter("%d,,", local->debug_id); 37 _enter("%d,,", local->debug_id);
38 38
39 whdr->type = RXRPC_PACKET_TYPE_BUSY;
40 whdr->serial = htonl(1);
41
39 msg.msg_name = &srx->transport.sin; 42 msg.msg_name = &srx->transport.sin;
40 msg.msg_namelen = sizeof(srx->transport.sin); 43 msg.msg_namelen = sizeof(srx->transport.sin);
41 msg.msg_control = NULL; 44 msg.msg_control = NULL;
42 msg.msg_controllen = 0; 45 msg.msg_controllen = 0;
43 msg.msg_flags = 0; 46 msg.msg_flags = 0;
44 47
45 hdr->seq = 0; 48 iov[0].iov_base = whdr;
46 hdr->type = RXRPC_PACKET_TYPE_BUSY; 49 iov[0].iov_len = sizeof(*whdr);
47 hdr->flags = 0;
48 hdr->userStatus = 0;
49 hdr->_rsvd = 0;
50
51 iov[0].iov_base = hdr;
52 iov[0].iov_len = sizeof(*hdr);
53 50
54 len = iov[0].iov_len; 51 len = iov[0].iov_len;
55 52
56 hdr->serial = htonl(1); 53 _proto("Tx BUSY %%1");
57 _proto("Tx BUSY %%%u", ntohl(hdr->serial));
58 54
59 ret = kernel_sendmsg(local->socket, &msg, iov, 1, len); 55 ret = kernel_sendmsg(local->socket, &msg, iov, 1, len);
60 if (ret < 0) { 56 if (ret < 0) {
@@ -185,8 +181,8 @@ invalid_service:
185 read_unlock_bh(&local->services_lock); 181 read_unlock_bh(&local->services_lock);
186 182
187 read_lock_bh(&call->state_lock); 183 read_lock_bh(&call->state_lock);
188 if (!test_bit(RXRPC_CALL_RELEASE, &call->flags) && 184 if (!test_bit(RXRPC_CALL_RELEASED, &call->flags) &&
189 !test_and_set_bit(RXRPC_CALL_RELEASE, &call->events)) { 185 !test_and_set_bit(RXRPC_CALL_EV_RELEASE, &call->events)) {
190 rxrpc_get_call(call); 186 rxrpc_get_call(call);
191 rxrpc_queue_call(call); 187 rxrpc_queue_call(call);
192 } 188 }
@@ -211,8 +207,8 @@ void rxrpc_accept_incoming_calls(struct work_struct *work)
211 struct rxrpc_skb_priv *sp; 207 struct rxrpc_skb_priv *sp;
212 struct sockaddr_rxrpc srx; 208 struct sockaddr_rxrpc srx;
213 struct rxrpc_sock *rx; 209 struct rxrpc_sock *rx;
210 struct rxrpc_wire_header whdr;
214 struct sk_buff *skb; 211 struct sk_buff *skb;
215 __be16 service_id;
216 int ret; 212 int ret;
217 213
218 _enter("%d", local->debug_id); 214 _enter("%d", local->debug_id);
@@ -240,6 +236,19 @@ process_next_packet:
240 236
241 sp = rxrpc_skb(skb); 237 sp = rxrpc_skb(skb);
242 238
239 /* Set up a response packet header in case we need it */
240 whdr.epoch = htonl(sp->hdr.epoch);
241 whdr.cid = htonl(sp->hdr.cid);
242 whdr.callNumber = htonl(sp->hdr.callNumber);
243 whdr.seq = htonl(sp->hdr.seq);
244 whdr.serial = 0;
245 whdr.flags = 0;
246 whdr.type = 0;
247 whdr.userStatus = 0;
248 whdr.securityIndex = sp->hdr.securityIndex;
249 whdr._rsvd = 0;
250 whdr.serviceId = htons(sp->hdr.serviceId);
251
243 /* determine the remote address */ 252 /* determine the remote address */
244 memset(&srx, 0, sizeof(srx)); 253 memset(&srx, 0, sizeof(srx));
245 srx.srx_family = AF_RXRPC; 254 srx.srx_family = AF_RXRPC;
@@ -256,10 +265,9 @@ process_next_packet:
256 } 265 }
257 266
258 /* get the socket providing the service */ 267 /* get the socket providing the service */
259 service_id = sp->hdr.serviceId;
260 read_lock_bh(&local->services_lock); 268 read_lock_bh(&local->services_lock);
261 list_for_each_entry(rx, &local->services, listen_link) { 269 list_for_each_entry(rx, &local->services, listen_link) {
262 if (rx->service_id == service_id && 270 if (rx->srx.srx_service == sp->hdr.serviceId &&
263 rx->sk.sk_state != RXRPC_CLOSE) 271 rx->sk.sk_state != RXRPC_CLOSE)
264 goto found_service; 272 goto found_service;
265 } 273 }
@@ -267,7 +275,7 @@ process_next_packet:
267 goto invalid_service; 275 goto invalid_service;
268 276
269found_service: 277found_service:
270 _debug("found service %hd", ntohs(rx->service_id)); 278 _debug("found service %hd", rx->srx.srx_service);
271 if (sk_acceptq_is_full(&rx->sk)) 279 if (sk_acceptq_is_full(&rx->sk))
272 goto backlog_full; 280 goto backlog_full;
273 sk_acceptq_added(&rx->sk); 281 sk_acceptq_added(&rx->sk);
@@ -296,7 +304,7 @@ found_service:
296backlog_full: 304backlog_full:
297 read_unlock_bh(&local->services_lock); 305 read_unlock_bh(&local->services_lock);
298busy: 306busy:
299 rxrpc_busy(local, &srx, &sp->hdr); 307 rxrpc_busy(local, &srx, &whdr);
300 rxrpc_free_skb(skb); 308 rxrpc_free_skb(skb);
301 goto process_next_packet; 309 goto process_next_packet;
302 310
@@ -379,7 +387,7 @@ struct rxrpc_call *rxrpc_accept_call(struct rxrpc_sock *rx,
379 rb_insert_color(&call->sock_node, &rx->calls); 387 rb_insert_color(&call->sock_node, &rx->calls);
380 if (test_and_set_bit(RXRPC_CALL_HAS_USERID, &call->flags)) 388 if (test_and_set_bit(RXRPC_CALL_HAS_USERID, &call->flags))
381 BUG(); 389 BUG();
382 if (test_and_set_bit(RXRPC_CALL_ACCEPTED, &call->events)) 390 if (test_and_set_bit(RXRPC_CALL_EV_ACCEPTED, &call->events))
383 BUG(); 391 BUG();
384 rxrpc_queue_call(call); 392 rxrpc_queue_call(call);
385 393
@@ -395,7 +403,7 @@ struct rxrpc_call *rxrpc_accept_call(struct rxrpc_sock *rx,
395out_release: 403out_release:
396 _debug("release %p", call); 404 _debug("release %p", call);
397 if (!test_bit(RXRPC_CALL_RELEASED, &call->flags) && 405 if (!test_bit(RXRPC_CALL_RELEASED, &call->flags) &&
398 !test_and_set_bit(RXRPC_CALL_RELEASE, &call->events)) 406 !test_and_set_bit(RXRPC_CALL_EV_RELEASE, &call->events))
399 rxrpc_queue_call(call); 407 rxrpc_queue_call(call);
400out_discard: 408out_discard:
401 write_unlock_bh(&call->state_lock); 409 write_unlock_bh(&call->state_lock);
@@ -407,7 +415,7 @@ out:
407} 415}
408 416
409/* 417/*
410 * handle rejectance of a call by userspace 418 * Handle rejection of a call by userspace
411 * - reject the call at the front of the queue 419 * - reject the call at the front of the queue
412 */ 420 */
413int rxrpc_reject_call(struct rxrpc_sock *rx) 421int rxrpc_reject_call(struct rxrpc_sock *rx)
@@ -434,7 +442,7 @@ int rxrpc_reject_call(struct rxrpc_sock *rx)
434 switch (call->state) { 442 switch (call->state) {
435 case RXRPC_CALL_SERVER_ACCEPTING: 443 case RXRPC_CALL_SERVER_ACCEPTING:
436 call->state = RXRPC_CALL_SERVER_BUSY; 444 call->state = RXRPC_CALL_SERVER_BUSY;
437 if (test_and_set_bit(RXRPC_CALL_REJECT_BUSY, &call->events)) 445 if (test_and_set_bit(RXRPC_CALL_EV_REJECT_BUSY, &call->events))
438 rxrpc_queue_call(call); 446 rxrpc_queue_call(call);
439 ret = 0; 447 ret = 0;
440 goto out_release; 448 goto out_release;
@@ -458,7 +466,7 @@ int rxrpc_reject_call(struct rxrpc_sock *rx)
458out_release: 466out_release:
459 _debug("release %p", call); 467 _debug("release %p", call);
460 if (!test_bit(RXRPC_CALL_RELEASED, &call->flags) && 468 if (!test_bit(RXRPC_CALL_RELEASED, &call->flags) &&
461 !test_and_set_bit(RXRPC_CALL_RELEASE, &call->events)) 469 !test_and_set_bit(RXRPC_CALL_EV_RELEASE, &call->events))
462 rxrpc_queue_call(call); 470 rxrpc_queue_call(call);
463out_discard: 471out_discard:
464 write_unlock_bh(&call->state_lock); 472 write_unlock_bh(&call->state_lock);
@@ -487,7 +495,6 @@ struct rxrpc_call *rxrpc_kernel_accept_call(struct socket *sock,
487 _leave(" = %p", call); 495 _leave(" = %p", call);
488 return call; 496 return call;
489} 497}
490
491EXPORT_SYMBOL(rxrpc_kernel_accept_call); 498EXPORT_SYMBOL(rxrpc_kernel_accept_call);
492 499
493/** 500/**
@@ -506,5 +513,4 @@ int rxrpc_kernel_reject_call(struct socket *sock)
506 _leave(" = %d", ret); 513 _leave(" = %d", ret);
507 return ret; 514 return ret;
508} 515}
509
510EXPORT_SYMBOL(rxrpc_kernel_reject_call); 516EXPORT_SYMBOL(rxrpc_kernel_reject_call);