From 01cb1f06df65fefad36143fa3a55d69aecf4a1c0 Mon Sep 17 00:00:00 2001 From: David Woodhouse Date: Tue, 14 Aug 2007 00:50:39 +0800 Subject: Import FEC code from Luigi Rizzo's RMDP Paper: http://info.iet.unipi.it/~luigi/mccr6.ps.gz Code: http://info.iet.unipi.it/~luigi/rmdp980703.tgz Signed-off-by: David Woodhouse --- mcast_image.h | 33 +++++++++++++++++++++++++++++++-- 1 file changed, 31 insertions(+), 2 deletions(-) (limited to 'mcast_image.h') diff --git a/mcast_image.h b/mcast_image.h index 96aa752..26c675e 100644 --- a/mcast_image.h +++ b/mcast_image.h @@ -1,14 +1,16 @@ #include -#define PKT_SIZE 1400 +#define PKT_SIZE 1410 struct image_pkt_hdr { uint32_t resend; uint32_t totcrc; uint32_t nr_blocks; uint32_t blocksize; + uint32_t block_crc; uint32_t block_nr; - uint32_t block_ofs; + uint16_t pkt_nr; + uint16_t nr_pkts; uint32_t thislen; uint32_t thiscrc; }; @@ -17,3 +19,30 @@ struct image_pkt { struct image_pkt_hdr hdr; unsigned char data[PKT_SIZE]; }; + +struct fec_parms; + +/* k - number of actual data packets + * n - total number of packets including data and redundant packets + * (actual packet size isn't relevant here) */ +struct fec_parms *fec_new(int k, int n); +void fec_free(struct fec_parms *p); + +/* src - array of (n) pointers to data packets + * fec - buffer for packet to be generated + * index - index of packet to be generated (0 <= index < n) + * sz - data packet size + */ +void fec_encode(struct fec_parms *code, unsigned char *src[], + unsigned char *fec, int index, int sz); + +/* data - array of (k) pointers to data packets, in arbitrary order (see i) + * i - indices of (data) packets + * sz - data packet size + * + * Will never fail as long as you give it (k) individual data packets. + * Will re-order the (data) pointers but not the indices -- data packets + * are ordered on return. + */ +int fec_decode(struct fec_parms *code, unsigned char *data[], + int i[], int sz); -- cgit v1.2.3