#include #define PKT_SIZE 2820 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 pkt_sequence; uint16_t pkt_nr; uint16_t nr_pkts; uint32_t thislen; uint32_t thiscrc; }; 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 * * _linear version just takes a pointer to the raw data; no * mucking about with packet pointers. */ void fec_encode(struct fec_parms *code, unsigned char *src[], unsigned char *fec, int index, int sz); void fec_encode_linear(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);