diff options
-rw-r--r-- | net/rxrpc/ar-internal.h | 13 | ||||
-rw-r--r-- | net/rxrpc/call_accept.c | 6 | ||||
-rw-r--r-- | net/rxrpc/input.c | 2 | ||||
-rw-r--r-- | net/rxrpc/output.c | 23 |
4 files changed, 26 insertions, 18 deletions
diff --git a/net/rxrpc/ar-internal.h b/net/rxrpc/ar-internal.h index 9fcb3e197b14..e8861cb78070 100644 --- a/net/rxrpc/ar-internal.h +++ b/net/rxrpc/ar-internal.h | |||
@@ -40,17 +40,12 @@ struct rxrpc_crypt { | |||
40 | struct rxrpc_connection; | 40 | struct rxrpc_connection; |
41 | 41 | ||
42 | /* | 42 | /* |
43 | * Mark applied to socket buffers. | 43 | * Mark applied to socket buffers in skb->mark. skb->priority is used |
44 | * to pass supplementary information. | ||
44 | */ | 45 | */ |
45 | enum rxrpc_skb_mark { | 46 | enum rxrpc_skb_mark { |
46 | RXRPC_SKB_MARK_DATA, /* data message */ | 47 | RXRPC_SKB_MARK_REJECT_BUSY, /* Reject with BUSY */ |
47 | RXRPC_SKB_MARK_FINAL_ACK, /* final ACK received message */ | 48 | RXRPC_SKB_MARK_REJECT_ABORT, /* Reject with ABORT (code in skb->priority) */ |
48 | RXRPC_SKB_MARK_BUSY, /* server busy message */ | ||
49 | RXRPC_SKB_MARK_REMOTE_ABORT, /* remote abort message */ | ||
50 | RXRPC_SKB_MARK_LOCAL_ABORT, /* local abort message */ | ||
51 | RXRPC_SKB_MARK_NET_ERROR, /* network error message */ | ||
52 | RXRPC_SKB_MARK_LOCAL_ERROR, /* local error message */ | ||
53 | RXRPC_SKB_MARK_NEW_CALL, /* local error message */ | ||
54 | }; | 49 | }; |
55 | 50 | ||
56 | /* | 51 | /* |
diff --git a/net/rxrpc/call_accept.c b/net/rxrpc/call_accept.c index 9d1e298b784c..e88f131c1d7f 100644 --- a/net/rxrpc/call_accept.c +++ b/net/rxrpc/call_accept.c | |||
@@ -353,7 +353,7 @@ struct rxrpc_call *rxrpc_new_incoming_call(struct rxrpc_local *local, | |||
353 | 353 | ||
354 | trace_rxrpc_abort(0, "INV", sp->hdr.cid, sp->hdr.callNumber, sp->hdr.seq, | 354 | trace_rxrpc_abort(0, "INV", sp->hdr.cid, sp->hdr.callNumber, sp->hdr.seq, |
355 | RX_INVALID_OPERATION, EOPNOTSUPP); | 355 | RX_INVALID_OPERATION, EOPNOTSUPP); |
356 | skb->mark = RXRPC_SKB_MARK_LOCAL_ABORT; | 356 | skb->mark = RXRPC_SKB_MARK_REJECT_ABORT; |
357 | skb->priority = RX_INVALID_OPERATION; | 357 | skb->priority = RX_INVALID_OPERATION; |
358 | _leave(" = NULL [service]"); | 358 | _leave(" = NULL [service]"); |
359 | return NULL; | 359 | return NULL; |
@@ -364,7 +364,7 @@ found_service: | |||
364 | rx->sk.sk_state == RXRPC_CLOSE) { | 364 | rx->sk.sk_state == RXRPC_CLOSE) { |
365 | trace_rxrpc_abort(0, "CLS", sp->hdr.cid, sp->hdr.callNumber, | 365 | trace_rxrpc_abort(0, "CLS", sp->hdr.cid, sp->hdr.callNumber, |
366 | sp->hdr.seq, RX_INVALID_OPERATION, ESHUTDOWN); | 366 | sp->hdr.seq, RX_INVALID_OPERATION, ESHUTDOWN); |
367 | skb->mark = RXRPC_SKB_MARK_LOCAL_ABORT; | 367 | skb->mark = RXRPC_SKB_MARK_REJECT_ABORT; |
368 | skb->priority = RX_INVALID_OPERATION; | 368 | skb->priority = RX_INVALID_OPERATION; |
369 | _leave(" = NULL [close]"); | 369 | _leave(" = NULL [close]"); |
370 | call = NULL; | 370 | call = NULL; |
@@ -373,7 +373,7 @@ found_service: | |||
373 | 373 | ||
374 | call = rxrpc_alloc_incoming_call(rx, local, conn, skb); | 374 | call = rxrpc_alloc_incoming_call(rx, local, conn, skb); |
375 | if (!call) { | 375 | if (!call) { |
376 | skb->mark = RXRPC_SKB_MARK_BUSY; | 376 | skb->mark = RXRPC_SKB_MARK_REJECT_BUSY; |
377 | _leave(" = NULL [busy]"); | 377 | _leave(" = NULL [busy]"); |
378 | call = NULL; | 378 | call = NULL; |
379 | goto out; | 379 | goto out; |
diff --git a/net/rxrpc/input.c b/net/rxrpc/input.c index 7f9ed3a60b9a..b0f12471f5e7 100644 --- a/net/rxrpc/input.c +++ b/net/rxrpc/input.c | |||
@@ -1354,7 +1354,7 @@ bad_message: | |||
1354 | protocol_error: | 1354 | protocol_error: |
1355 | skb->priority = RX_PROTOCOL_ERROR; | 1355 | skb->priority = RX_PROTOCOL_ERROR; |
1356 | post_abort: | 1356 | post_abort: |
1357 | skb->mark = RXRPC_SKB_MARK_LOCAL_ABORT; | 1357 | skb->mark = RXRPC_SKB_MARK_REJECT_ABORT; |
1358 | reject_packet: | 1358 | reject_packet: |
1359 | trace_rxrpc_rx_done(skb->mark, skb->priority); | 1359 | trace_rxrpc_rx_done(skb->mark, skb->priority); |
1360 | rxrpc_reject_packet(local, skb); | 1360 | rxrpc_reject_packet(local, skb); |
diff --git a/net/rxrpc/output.c b/net/rxrpc/output.c index 8a4da3fe96df..e8fb8922bca8 100644 --- a/net/rxrpc/output.c +++ b/net/rxrpc/output.c | |||
@@ -524,7 +524,7 @@ void rxrpc_reject_packets(struct rxrpc_local *local) | |||
524 | struct kvec iov[2]; | 524 | struct kvec iov[2]; |
525 | size_t size; | 525 | size_t size; |
526 | __be32 code; | 526 | __be32 code; |
527 | int ret; | 527 | int ret, ioc; |
528 | 528 | ||
529 | _enter("%d", local->debug_id); | 529 | _enter("%d", local->debug_id); |
530 | 530 | ||
@@ -532,7 +532,6 @@ void rxrpc_reject_packets(struct rxrpc_local *local) | |||
532 | iov[0].iov_len = sizeof(whdr); | 532 | iov[0].iov_len = sizeof(whdr); |
533 | iov[1].iov_base = &code; | 533 | iov[1].iov_base = &code; |
534 | iov[1].iov_len = sizeof(code); | 534 | iov[1].iov_len = sizeof(code); |
535 | size = sizeof(whdr) + sizeof(code); | ||
536 | 535 | ||
537 | msg.msg_name = &srx.transport; | 536 | msg.msg_name = &srx.transport; |
538 | msg.msg_control = NULL; | 537 | msg.msg_control = NULL; |
@@ -540,17 +539,31 @@ void rxrpc_reject_packets(struct rxrpc_local *local) | |||
540 | msg.msg_flags = 0; | 539 | msg.msg_flags = 0; |
541 | 540 | ||
542 | memset(&whdr, 0, sizeof(whdr)); | 541 | memset(&whdr, 0, sizeof(whdr)); |
543 | whdr.type = RXRPC_PACKET_TYPE_ABORT; | ||
544 | 542 | ||
545 | while ((skb = skb_dequeue(&local->reject_queue))) { | 543 | while ((skb = skb_dequeue(&local->reject_queue))) { |
546 | rxrpc_see_skb(skb, rxrpc_skb_rx_seen); | 544 | rxrpc_see_skb(skb, rxrpc_skb_rx_seen); |
547 | sp = rxrpc_skb(skb); | 545 | sp = rxrpc_skb(skb); |
548 | 546 | ||
547 | switch (skb->mark) { | ||
548 | case RXRPC_SKB_MARK_REJECT_BUSY: | ||
549 | whdr.type = RXRPC_PACKET_TYPE_BUSY; | ||
550 | size = sizeof(whdr); | ||
551 | ioc = 1; | ||
552 | break; | ||
553 | case RXRPC_SKB_MARK_REJECT_ABORT: | ||
554 | whdr.type = RXRPC_PACKET_TYPE_ABORT; | ||
555 | code = htonl(skb->priority); | ||
556 | size = sizeof(whdr) + sizeof(code); | ||
557 | ioc = 2; | ||
558 | break; | ||
559 | default: | ||
560 | rxrpc_free_skb(skb, rxrpc_skb_rx_freed); | ||
561 | continue; | ||
562 | } | ||
563 | |||
549 | if (rxrpc_extract_addr_from_skb(local, &srx, skb) == 0) { | 564 | if (rxrpc_extract_addr_from_skb(local, &srx, skb) == 0) { |
550 | msg.msg_namelen = srx.transport_len; | 565 | msg.msg_namelen = srx.transport_len; |
551 | 566 | ||
552 | code = htonl(skb->priority); | ||
553 | |||
554 | whdr.epoch = htonl(sp->hdr.epoch); | 567 | whdr.epoch = htonl(sp->hdr.epoch); |
555 | whdr.cid = htonl(sp->hdr.cid); | 568 | whdr.cid = htonl(sp->hdr.cid); |
556 | whdr.callNumber = htonl(sp->hdr.callNumber); | 569 | whdr.callNumber = htonl(sp->hdr.callNumber); |