rxrpc: Implement a mechanism to send an event notification to a connection
[sfrench/cifs-2.6.git] / net / rxrpc / conn_event.c
index 480364bcbf855755a0f6c43ab627c7e14c8071f8..7a980a32344f1c8d5055430b8f3b32ea8ddf670e 100644 (file)
@@ -19,9 +19,9 @@
 /*
  * Retransmit terminal ACK or ABORT of the previous call.
  */
-static void rxrpc_conn_retransmit_call(struct rxrpc_connection *conn,
-                                      struct sk_buff *skb,
-                                      unsigned int channel)
+void rxrpc_conn_retransmit_call(struct rxrpc_connection *conn,
+                               struct sk_buff *skb,
+                               unsigned int channel)
 {
        struct rxrpc_skb_priv *sp = skb ? rxrpc_skb(skb) : NULL;
        struct rxrpc_channel *chan;
@@ -292,24 +292,6 @@ static int rxrpc_process_event(struct rxrpc_connection *conn,
        _enter("{%d},{%u,%%%u},", conn->debug_id, sp->hdr.type, sp->hdr.serial);
 
        switch (sp->hdr.type) {
-       case RXRPC_PACKET_TYPE_DATA:
-       case RXRPC_PACKET_TYPE_ACK:
-               rxrpc_conn_retransmit_call(conn, skb,
-                                          sp->hdr.cid & RXRPC_CHANNELMASK);
-               return 0;
-
-       case RXRPC_PACKET_TYPE_BUSY:
-               /* Just ignore BUSY packets for now. */
-               return 0;
-
-       case RXRPC_PACKET_TYPE_ABORT:
-               conn->error = -ECONNABORTED;
-               conn->abort_code = skb->priority;
-               conn->state = RXRPC_CONN_REMOTELY_ABORTED;
-               set_bit(RXRPC_CONN_DONT_REUSE, &conn->flags);
-               rxrpc_abort_calls(conn, RXRPC_CALL_REMOTELY_ABORTED, sp->hdr.serial);
-               return -ECONNABORTED;
-
        case RXRPC_PACKET_TYPE_CHALLENGE:
                return conn->security->respond_to_challenge(conn, skb,
                                                            _abort_code);
@@ -430,10 +412,6 @@ static void rxrpc_do_process_connection(struct rxrpc_connection *conn)
        if (test_and_clear_bit(RXRPC_CONN_EV_CHALLENGE, &conn->events))
                rxrpc_secure_connection(conn);
 
-       /* Process delayed ACKs whose time has come. */
-       if (conn->flags & RXRPC_CONN_FINAL_ACK_MASK)
-               rxrpc_process_delayed_final_acks(conn, false);
-
        /* go through the conn-level event packets, releasing the ref on this
         * connection that each one has when we've finished with it */
        while ((skb = skb_dequeue(&conn->rx_queue))) {
@@ -504,18 +482,12 @@ int rxrpc_input_conn_packet(struct rxrpc_connection *conn, struct sk_buff *skb)
 
        if (conn->state >= RXRPC_CONN_REMOTELY_ABORTED) {
                _leave(" = -ECONNABORTED [%u]", conn->state);
-               return -ECONNABORTED;
+               return 0;
        }
 
        _enter("{%d},{%u,%%%u},", conn->debug_id, sp->hdr.type, sp->hdr.serial);
 
        switch (sp->hdr.type) {
-       case RXRPC_PACKET_TYPE_DATA:
-       case RXRPC_PACKET_TYPE_ACK:
-               rxrpc_conn_retransmit_call(conn, skb,
-                                          sp->hdr.cid & RXRPC_CHANNELMASK);
-               return 0;
-
        case RXRPC_PACKET_TYPE_BUSY:
                /* Just ignore BUSY packets for now. */
                return 0;
@@ -526,7 +498,7 @@ int rxrpc_input_conn_packet(struct rxrpc_connection *conn, struct sk_buff *skb)
                conn->state = RXRPC_CONN_REMOTELY_ABORTED;
                set_bit(RXRPC_CONN_DONT_REUSE, &conn->flags);
                rxrpc_abort_calls(conn, RXRPC_CALL_REMOTELY_ABORTED, sp->hdr.serial);
-               return -ECONNABORTED;
+               return 0;
 
        case RXRPC_PACKET_TYPE_CHALLENGE:
        case RXRPC_PACKET_TYPE_RESPONSE:
@@ -539,3 +511,13 @@ int rxrpc_input_conn_packet(struct rxrpc_connection *conn, struct sk_buff *skb)
                return -EPROTO;
        }
 }
+
+/*
+ * Input a connection event.
+ */
+void rxrpc_input_conn_event(struct rxrpc_connection *conn, struct sk_buff *skb)
+{
+       /* Process delayed ACKs whose time has come. */
+       if (conn->flags & RXRPC_CONN_FINAL_ACK_MASK)
+               rxrpc_process_delayed_final_acks(conn, false);
+}