diff options
Diffstat (limited to 'net/rxrpc/ar-accept.c')
| -rw-r--r-- | net/rxrpc/ar-accept.c | 56 |
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 | */ |
| 29 | static int rxrpc_busy(struct rxrpc_local *local, struct sockaddr_rxrpc *srx, | 29 | static 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 | ||
| 269 | found_service: | 277 | found_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: | |||
| 296 | backlog_full: | 304 | backlog_full: |
| 297 | read_unlock_bh(&local->services_lock); | 305 | read_unlock_bh(&local->services_lock); |
| 298 | busy: | 306 | busy: |
| 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, | |||
| 395 | out_release: | 403 | out_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); |
| 400 | out_discard: | 408 | out_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 | */ |
| 413 | int rxrpc_reject_call(struct rxrpc_sock *rx) | 421 | int 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) | |||
| 458 | out_release: | 466 | out_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); |
| 463 | out_discard: | 471 | out_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 | |||
| 491 | EXPORT_SYMBOL(rxrpc_kernel_accept_call); | 498 | EXPORT_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 | |||
| 510 | EXPORT_SYMBOL(rxrpc_kernel_reject_call); | 516 | EXPORT_SYMBOL(rxrpc_kernel_reject_call); |
