Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit f0100891 authored by David S. Miller's avatar David S. Miller
Browse files


David Howells says:

====================
rxrpc: Fixes

Here are three fixes for AF_RXRPC and two tracepoints that were useful for
finding them:

 (1) Fix missing start of expect-Rx-by timeout on initial packet
     transmission so that calls will time out if the peer doesn't respond.

 (2) Fix error reception on AF_INET6 sockets by using the correct family of
     sockopts on the UDP transport socket.

 (3) Fix setting the minimum security level on kernel calls so that they
     can be encrypted.

 (4) Add a tracepoint to log ICMP/ICMP6 and other error reports from the
     transport socket.

 (5) Add a tracepoint to log UDP sendmsg failure so that we can find out if
     transmission failure occurred on the UDP socket.
====================

Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parents af5d0184 6b47fe1d
Loading
Loading
Loading
Loading
+85 −0
Original line number Diff line number Diff line
@@ -15,6 +15,7 @@
#define _TRACE_RXRPC_H

#include <linux/tracepoint.h>
#include <linux/errqueue.h>

/*
 * Define enums for tracing information.
@@ -210,6 +211,20 @@ enum rxrpc_congest_change {
	rxrpc_cong_saw_nack,
};

enum rxrpc_tx_fail_trace {
	rxrpc_tx_fail_call_abort,
	rxrpc_tx_fail_call_ack,
	rxrpc_tx_fail_call_data_frag,
	rxrpc_tx_fail_call_data_nofrag,
	rxrpc_tx_fail_call_final_resend,
	rxrpc_tx_fail_conn_abort,
	rxrpc_tx_fail_conn_challenge,
	rxrpc_tx_fail_conn_response,
	rxrpc_tx_fail_reject,
	rxrpc_tx_fail_version_keepalive,
	rxrpc_tx_fail_version_reply,
};

#endif /* end __RXRPC_DECLARE_TRACE_ENUMS_ONCE_ONLY */

/*
@@ -437,6 +452,19 @@ enum rxrpc_congest_change {
	EM(RXRPC_CALL_LOCAL_ERROR,		"LocalError") \
	E_(RXRPC_CALL_NETWORK_ERROR,		"NetError")

#define rxrpc_tx_fail_traces \
	EM(rxrpc_tx_fail_call_abort,		"CallAbort") \
	EM(rxrpc_tx_fail_call_ack,		"CallAck") \
	EM(rxrpc_tx_fail_call_data_frag,	"CallDataFrag") \
	EM(rxrpc_tx_fail_call_data_nofrag,	"CallDataNofrag") \
	EM(rxrpc_tx_fail_call_final_resend,	"CallFinalResend") \
	EM(rxrpc_tx_fail_conn_abort,		"ConnAbort") \
	EM(rxrpc_tx_fail_conn_challenge,	"ConnChall") \
	EM(rxrpc_tx_fail_conn_response,		"ConnResp") \
	EM(rxrpc_tx_fail_reject,		"Reject") \
	EM(rxrpc_tx_fail_version_keepalive,	"VerKeepalive") \
	E_(rxrpc_tx_fail_version_reply,		"VerReply")

/*
 * Export enum symbols via userspace.
 */
@@ -460,6 +488,7 @@ rxrpc_propose_ack_traces;
rxrpc_propose_ack_outcomes;
rxrpc_congest_modes;
rxrpc_congest_changes;
rxrpc_tx_fail_traces;

/*
 * Now redefine the EM() and E_() macros to map the enums to the strings that
@@ -1374,6 +1403,62 @@ TRACE_EVENT(rxrpc_resend,
		      __entry->anno)
	    );

TRACE_EVENT(rxrpc_rx_icmp,
	    TP_PROTO(struct rxrpc_peer *peer, struct sock_extended_err *ee,
		     struct sockaddr_rxrpc *srx),

	    TP_ARGS(peer, ee, srx),

	    TP_STRUCT__entry(
		    __field(unsigned int,			peer	)
		    __field_struct(struct sock_extended_err,	ee	)
		    __field_struct(struct sockaddr_rxrpc,	srx	)
			     ),

	    TP_fast_assign(
		    __entry->peer = peer->debug_id;
		    memcpy(&__entry->ee, ee, sizeof(__entry->ee));
		    memcpy(&__entry->srx, srx, sizeof(__entry->srx));
			   ),

	    TP_printk("P=%08x o=%u t=%u c=%u i=%u d=%u e=%d %pISp",
		      __entry->peer,
		      __entry->ee.ee_origin,
		      __entry->ee.ee_type,
		      __entry->ee.ee_code,
		      __entry->ee.ee_info,
		      __entry->ee.ee_data,
		      __entry->ee.ee_errno,
		      &__entry->srx.transport)
	    );

TRACE_EVENT(rxrpc_tx_fail,
	    TP_PROTO(unsigned int debug_id, rxrpc_serial_t serial, int ret,
		     enum rxrpc_tx_fail_trace what),

	    TP_ARGS(debug_id, serial, ret, what),

	    TP_STRUCT__entry(
		    __field(unsigned int,		debug_id	)
		    __field(rxrpc_serial_t,		serial		)
		    __field(int,			ret		)
		    __field(enum rxrpc_tx_fail_trace,   what		)
			     ),

	    TP_fast_assign(
		    __entry->debug_id = debug_id;
		    __entry->serial = serial;
		    __entry->ret = ret;
		    __entry->what = what;
			   ),

	    TP_printk("c=%08x r=%x ret=%d %s",
		      __entry->debug_id,
		      __entry->serial,
		      __entry->ret,
		      __print_symbolic(__entry->what, rxrpc_tx_fail_traces))
	    );

#endif /* _TRACE_RXRPC_H */

/* This part must be outside protection */
+1 −1
Original line number Diff line number Diff line
@@ -313,7 +313,7 @@ struct rxrpc_call *rxrpc_kernel_begin_call(struct socket *sock,
	memset(&cp, 0, sizeof(cp));
	cp.local		= rx->local;
	cp.key			= key;
	cp.security_level	= 0;
	cp.security_level	= rx->min_sec_level;
	cp.exclusive		= false;
	cp.upgrade		= upgrade;
	cp.service_id		= srx->srx_service;
+1 −0
Original line number Diff line number Diff line
@@ -476,6 +476,7 @@ enum rxrpc_call_flag {
	RXRPC_CALL_SEND_PING,		/* A ping will need to be sent */
	RXRPC_CALL_PINGING,		/* Ping in process */
	RXRPC_CALL_RETRANS_TIMEOUT,	/* Retransmission due to timeout occurred */
	RXRPC_CALL_BEGAN_RX_TIMER,	/* We began the expect_rx_by timer */
};

/*
+8 −3
Original line number Diff line number Diff line
@@ -40,7 +40,7 @@ static void rxrpc_conn_retransmit_call(struct rxrpc_connection *conn,
	} __attribute__((packed)) pkt;
	struct rxrpc_ackinfo ack_info;
	size_t len;
	int ioc;
	int ret, ioc;
	u32 serial, mtu, call_id, padding;

	_enter("%d", conn->debug_id);
@@ -135,10 +135,13 @@ static void rxrpc_conn_retransmit_call(struct rxrpc_connection *conn,
		break;
	}

	kernel_sendmsg(conn->params.local->socket, &msg, iov, ioc, len);
	ret = kernel_sendmsg(conn->params.local->socket, &msg, iov, ioc, len);
	conn->params.peer->last_tx_at = ktime_get_real();
	if (ret < 0)
		trace_rxrpc_tx_fail(conn->debug_id, serial, ret,
				    rxrpc_tx_fail_call_final_resend);

	_leave("");
	return;
}

/*
@@ -236,6 +239,8 @@ static int rxrpc_abort_connection(struct rxrpc_connection *conn,

	ret = kernel_sendmsg(conn->params.local->socket, &msg, iov, 2, len);
	if (ret < 0) {
		trace_rxrpc_tx_fail(conn->debug_id, serial, ret,
				    rxrpc_tx_fail_conn_abort);
		_debug("sendmsg failed: %d", ret);
		return -EAGAIN;
	}
+1 −1
Original line number Diff line number Diff line
@@ -971,7 +971,7 @@ static void rxrpc_input_call_packet(struct rxrpc_call *call,
	if (timo) {
		unsigned long now = jiffies, expect_rx_by;

		expect_rx_by = jiffies + timo;
		expect_rx_by = now + timo;
		WRITE_ONCE(call->expect_rx_by, expect_rx_by);
		rxrpc_reduce_call_timer(call, expect_rx_by, now,
					rxrpc_timer_set_for_normal);
Loading