Browse Source

rxrpc: Cache the security index in the rxrpc_call struct

Cache the security index in the rxrpc_call struct so that we can get at it
even when the call has been disconnected and the connection pointer
cleared.

Signed-off-by: David Howells <dhowells@redhat.com>
David Howells 9 years ago
parent
commit
278ac0cdd5
5 changed files with 7 additions and 2 deletions
  1. 1 0
      net/rxrpc/ar-internal.h
  2. 1 0
      net/rxrpc/call_object.c
  3. 3 0
      net/rxrpc/conn_client.c
  4. 1 1
      net/rxrpc/input.c
  5. 1 1
      net/rxrpc/sendmsg.c

+ 1 - 0
net/rxrpc/ar-internal.h

@@ -475,6 +475,7 @@ struct rxrpc_call {
 	atomic_t		skb_count;	/* Outstanding packets on this call */
 	atomic_t		skb_count;	/* Outstanding packets on this call */
 	atomic_t		sequence;	/* Tx data packet sequence counter */
 	atomic_t		sequence;	/* Tx data packet sequence counter */
 	u16			service_id;	/* service ID */
 	u16			service_id;	/* service ID */
+	u8			security_ix;	/* Security type */
 	u32			call_id;	/* call ID on connection  */
 	u32			call_id;	/* call ID on connection  */
 	u32			cid;		/* connection ID plus channel index */
 	u32			cid;		/* connection ID plus channel index */
 	int			debug_id;	/* debug ID for printks */
 	int			debug_id;	/* debug ID for printks */

+ 1 - 0
net/rxrpc/call_object.c

@@ -345,6 +345,7 @@ struct rxrpc_call *rxrpc_incoming_call(struct rxrpc_sock *rx,
 	candidate->peer		= conn->params.peer;
 	candidate->peer		= conn->params.peer;
 	candidate->cid		= sp->hdr.cid;
 	candidate->cid		= sp->hdr.cid;
 	candidate->call_id	= sp->hdr.callNumber;
 	candidate->call_id	= sp->hdr.callNumber;
+	candidate->security_ix	= sp->hdr.securityIndex;
 	candidate->rx_data_post	= 0;
 	candidate->rx_data_post	= 0;
 	candidate->state	= RXRPC_CALL_SERVER_ACCEPTING;
 	candidate->state	= RXRPC_CALL_SERVER_ACCEPTING;
 	candidate->flags	|= (1 << RXRPC_CALL_IS_SERVICE);
 	candidate->flags	|= (1 << RXRPC_CALL_IS_SERVICE);

+ 3 - 0
net/rxrpc/conn_client.c

@@ -348,6 +348,7 @@ static int rxrpc_get_client_conn(struct rxrpc_call *call,
 
 
 	if (cp->exclusive) {
 	if (cp->exclusive) {
 		call->conn = candidate;
 		call->conn = candidate;
+		call->security_ix = candidate->security_ix;
 		_leave(" = 0 [exclusive %d]", candidate->debug_id);
 		_leave(" = 0 [exclusive %d]", candidate->debug_id);
 		return 0;
 		return 0;
 	}
 	}
@@ -395,6 +396,7 @@ static int rxrpc_get_client_conn(struct rxrpc_call *call,
 candidate_published:
 candidate_published:
 	set_bit(RXRPC_CONN_IN_CLIENT_CONNS, &candidate->flags);
 	set_bit(RXRPC_CONN_IN_CLIENT_CONNS, &candidate->flags);
 	call->conn = candidate;
 	call->conn = candidate;
+	call->security_ix = candidate->security_ix;
 	spin_unlock(&local->client_conns_lock);
 	spin_unlock(&local->client_conns_lock);
 	_leave(" = 0 [new %d]", candidate->debug_id);
 	_leave(" = 0 [new %d]", candidate->debug_id);
 	return 0;
 	return 0;
@@ -412,6 +414,7 @@ found_extant_conn:
 
 
 	spin_lock(&conn->channel_lock);
 	spin_lock(&conn->channel_lock);
 	call->conn = conn;
 	call->conn = conn;
+	call->security_ix = conn->security_ix;
 	list_add(&call->chan_wait_link, &conn->waiting_calls);
 	list_add(&call->chan_wait_link, &conn->waiting_calls);
 	spin_unlock(&conn->channel_lock);
 	spin_unlock(&conn->channel_lock);
 	_leave(" = 0 [extant %d]", conn->debug_id);
 	_leave(" = 0 [extant %d]", conn->debug_id);

+ 1 - 1
net/rxrpc/input.c

@@ -198,7 +198,7 @@ static int rxrpc_fast_process_data(struct rxrpc_call *call,
 
 
 	/* if the packet need security things doing to it, then it goes down
 	/* if the packet need security things doing to it, then it goes down
 	 * the slow path */
 	 * the slow path */
-	if (call->conn->security_ix)
+	if (call->security_ix)
 		goto enqueue_packet;
 		goto enqueue_packet;
 
 
 	sp->call = call;
 	sp->call = call;

+ 1 - 1
net/rxrpc/sendmsg.c

@@ -322,7 +322,7 @@ static int rxrpc_send_data(struct rxrpc_sock *rx,
 			sp->hdr.serial	= atomic_inc_return(&conn->serial);
 			sp->hdr.serial	= atomic_inc_return(&conn->serial);
 			sp->hdr.type	= RXRPC_PACKET_TYPE_DATA;
 			sp->hdr.type	= RXRPC_PACKET_TYPE_DATA;
 			sp->hdr.userStatus = 0;
 			sp->hdr.userStatus = 0;
-			sp->hdr.securityIndex = conn->security_ix;
+			sp->hdr.securityIndex = call->security_ix;
 			sp->hdr._rsvd	= 0;
 			sp->hdr._rsvd	= 0;
 			sp->hdr.serviceId = call->service_id;
 			sp->hdr.serviceId = call->service_id;