rxrpc: Trace protocol errors in received packets
Add a tracepoint (rxrpc_rx_proto) to record protocol errors in received packets. The following changes are made: (1) Add a function, __rxrpc_abort_eproto(), to note a protocol error on a call and mark the call aborted. This is wrapped by rxrpc_abort_eproto() that makes the why string usable in trace. (2) Add trace_rxrpc_rx_proto() or rxrpc_abort_eproto() to protocol error generation points, replacing rxrpc_abort_call() with the latter. (3) Only send an abort packet in rxkad_verify_packet*() if we actually managed to abort the call. Note that a trace event is also emitted if a kernel user (e.g. afs) tries to send data through a call when it's not in the transmission phase, though it's not technically a receive event. Signed-off-by: David Howells <dhowells@redhat.com>
This commit is contained in:
@@ -281,8 +281,11 @@ static int rxrpc_process_event(struct rxrpc_connection *conn,
|
||||
|
||||
case RXRPC_PACKET_TYPE_ABORT:
|
||||
if (skb_copy_bits(skb, sizeof(struct rxrpc_wire_header),
|
||||
&wtmp, sizeof(wtmp)) < 0)
|
||||
&wtmp, sizeof(wtmp)) < 0) {
|
||||
trace_rxrpc_rx_eproto(NULL, sp->hdr.serial,
|
||||
tracepoint_string("bad_abort"));
|
||||
return -EPROTO;
|
||||
}
|
||||
abort_code = ntohl(wtmp);
|
||||
_proto("Rx ABORT %%%u { ac=%d }", sp->hdr.serial, abort_code);
|
||||
|
||||
@@ -327,7 +330,8 @@ static int rxrpc_process_event(struct rxrpc_connection *conn,
|
||||
return 0;
|
||||
|
||||
default:
|
||||
_leave(" = -EPROTO [%u]", sp->hdr.type);
|
||||
trace_rxrpc_rx_eproto(NULL, sp->hdr.serial,
|
||||
tracepoint_string("bad_conn_pkt"));
|
||||
return -EPROTO;
|
||||
}
|
||||
}
|
||||
@@ -422,6 +426,5 @@ protocol_error:
|
||||
if (rxrpc_abort_connection(conn, ret, abort_code) < 0)
|
||||
goto requeue_and_leave;
|
||||
rxrpc_free_skb(skb, rxrpc_skb_rx_freed);
|
||||
_leave(" [EPROTO]");
|
||||
goto out;
|
||||
}
|
||||
|
Reference in New Issue
Block a user