[PATCH 01/16] ratp: add missing transition to SYN-RECEIVED in behavior B

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



The reference says:

    If the SYN flag was set but the ACK was not set then the other
    end of the connection has executed an active open also.
    Acknowledge the SYN, choose your MDL, and send:
        <SN=0><AN=received SN+1 modulo 2><CTL=SYN, ACK><LENGTH=MDL>
    Go to the SYN-RECEIVED state without any further processing.

Add this missing step.

Signed-off-by: Aleksander Morgado <aleksander@xxxxxxxxxxxxx>
---
 lib/ratp.c | 14 +++++++++-----
 1 file changed, 9 insertions(+), 5 deletions(-)

diff --git a/lib/ratp.c b/lib/ratp.c
index 22e83636f..0d384aa4e 100644
--- a/lib/ratp.c
+++ b/lib/ratp.c
@@ -619,21 +619,25 @@ static void ratp_behaviour_b(struct ratp_internal *ri, void *pkt)
 	if (hdr->control & RATP_CONTROL_SYN) {
 		uint8_t control;
 
+		ri->sn_received = ratp_sn(hdr);
+
 		if (hdr->control & RATP_CONTROL_ACK) {
 			control = ratp_set_sn(ratp_an(hdr)) |
 				ratp_set_an(!ratp_sn(hdr)) |
 				RATP_CONTROL_ACK;
+			ratp_send_hdr(ri, control);
+			ratp_state_change(ri, RATP_STATE_ESTABLISHED);
 		} else {
+			struct ratp_header synack = {};
+
 			control = ratp_set_an(!ratp_sn(hdr)) |
 				RATP_CONTROL_SYN |
 				RATP_CONTROL_ACK;
 
+			ratp_create_packet(ri, &synack, control, 255);
+			ratp_send_pkt(ri, &synack, sizeof(synack));
+			ratp_state_change(ri, RATP_STATE_SYN_RECEIVED);
 		}
-
-		ri->sn_received = ratp_sn(hdr);
-
-		ratp_send_hdr(ri, control);
-		ratp_state_change(ri, RATP_STATE_ESTABLISHED);
 	}
 }
 
-- 
2.13.1


_______________________________________________
barebox mailing list
barebox@xxxxxxxxxxxxxxxxxxx
http://lists.infradead.org/mailman/listinfo/barebox



[Index of Archives]     [Linux Embedded]     [Linux USB Devel]     [Linux Audio Users]     [Yosemite News]     [Linux Kernel]     [Linux SCSI]     [XFree86]

  Powered by Linux