[PATCH 1/4] Add Reliable Asynchronous Transfer Protocol

Peter Korsgaard peter at korsgaard.com
Fri Jun 12 05:05:04 PDT 2015


>>>>> "Sascha" == Sascha Hauer <s.hauer at pengutronix.de> writes:

 > This patch adds support for Reliable Asynchronous Transfer Protocol (RATP)
 > as described in RFC916.

 > Communication over RS232 is often unreliable as characters are lost or
 > misinterpreted. This protocol allows for a reliable packet based communication
 > over serial lines.

 > The implementation simply follows the state machine described in the RFC text.

Almost ;)

> +static int ratp_recv_pkt_data(struct ratp *ratp, void *data, uint8_t len,
 > +		int poll_timeout_ms)
 > +{
 > +	uint16_t crc_expect, crc_read;
 > +	int ret, i;
 > +
 > +	for (i = 0; i < len + 2; i++) {
 > +		ret = ratp_getc(ratp, data + i, poll_timeout_ms);
 > +		if (ret < 0)
 > +			return ret;
 > +	}
 > +
 > +	crc_expect = cyg_crc16(data, len);

Why crc16? RFC916 states that the checksum is the inverted 1s complement
16bit sum, E.G. like TCP/UDP/IP header checksums:

         Checksum Algorithm

            The checksum algorithm chosen is similar to that used by
            IP/TCP protocols [IP 81] [TCP 81].  This algorithm has shown
            itself to be both reliable and relatively easy to compute.
            The interested reader may refer to [TCP Checksum 78] for a
            more thorough discussion of its properties.

         The checksum algorithm is:

            SENDER

               The unsigned sum of the 16-bit words of the data portion
               of the packet is formed.  Any overflow is added into the
               lowest order bit.  This sum does not include the header
               portion of the packet.  For the purpose of building a
               packet for transmission the two octet checksum field is
               zero.  The sum formed is then bit complemented and
               inserted into the checksum field before transmission.

               If the total number of data octets is odd then the last
               octet is padded to the right (low order) with zeros to
               form a 16-bit word for checksum purposes.  This pad octet
               is not transmitted as part of the packet.

E.G. something like;

http://www.roman10.net/how-to-calculate-iptcpudp-checksumpart-2-implementation/

-- 
Bye, Peter Korsgaard



More information about the barebox mailing list