diff options
| author | David Woodhouse <dwmw2@infradead.org> | 2007-08-14 00:50:39 +0800 | 
|---|---|---|
| committer | David Woodhouse <dwmw2@infradead.org> | 2007-08-14 00:50:39 +0800 | 
| commit | 01cb1f06df65fefad36143fa3a55d69aecf4a1c0 (patch) | |
| tree | 03468db2abc95a10e11a19ca015d1888bd401576 /mcast_image.h | |
| parent | 34a3278c85e883e3279b14acd57b02610c1039e3 (diff) | |
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 <dwmw2@infradead.org>
Diffstat (limited to 'mcast_image.h')
| -rw-r--r-- | mcast_image.h | 33 | 
1 files changed, 31 insertions, 2 deletions
| 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 <stdint.h> -#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); | 
