int mxcoding_lil_ppg(unsigned char *pdes, unsigned char *psrc, int block_size, int packet_size, lil_t *pzlil, int m, int k){ int row, col; int i, j, p; int times; int rest_size; int bgfsize, pgfsize; gfele_t val; gfele_t *pgdes, *pgsrc; (void)m; (void)k; assert(block_size >= packet_size); //row = ZLIL_ROW(m, k); //col = ZLIL_COL(m, k); row = pzlil->row; col = pzlil->col; times = block_size/packet_size; bgfsize = block_size/sizeof(gfele_t); pgfsize = packet_size/sizeof(gfele_t); memset(pdes, 0, row*((size_t)block_size)); rest_size = block_size - times*packet_size; if(rest_size == 0){ pgdes = (gfele_t *)pdes; pgsrc = (gfele_t *)psrc; for(i = 0; i < row; ++i){ for(p = 0; p < times; ++p){ for(j = 0; j < col; ++j){ val = (gfele_t)pzlil->data[i*col+j]; region_xor(pgdes, pgsrc+val*bgfsize+p*pgfsize, packet_size); } pgdes = pgdes + pgfsize; } } }else{ pgdes = (gfele_t *)pdes; for(i = 0; i < row; ++i){ for(p = 0; p < times; ++p){ pgsrc = (gfele_t *)(psrc + p*packet_size); for(j = 0; j < col; ++j){ val = (gfele_t)pzlil->data[i*col+j]; region_xor(pgdes, pgsrc+val*bgfsize, packet_size); } pgdes = pgdes + pgfsize; } pgsrc = (gfele_t *)(psrc+times*packet_size); for(j = 0; j < col; ++j){ val = (gfele_t)pzlil->data[i*col+j]; region_xor(pgdes, pgsrc+val*bgfsize, rest_size); } pgdes = pgdes + rest_size/sizeof(gfele_t); } } return 1; }
int mxcoding_dbg(unsigned char *pdes, unsigned char *psrc, int block_size, int packet_size, gfmat_t *pmat){ int row, col; int i, j, k; int times; int rest_size; int pgfsize; gfele_t val; gfele_t *pgdes, *pgsrc; assert(block_size >= packet_size); row = pmat->row; col = pmat->col; times = block_size/packet_size; pgfsize = packet_size/sizeof(gfele_t); rest_size = block_size - times*packet_size; memset(pdes, 0, row*block_size); if(rest_size == 0){ for(j = 0; j < col; ++j){ for(i = 0; i < row; ++i){ val = pmat->data[i*col+j]; if(val == 0) continue; pgsrc = (gfele_t *)(psrc + j*block_size); pgdes = (gfele_t *)(pdes + i*block_size); for(k = 0; k < times; ++k){ region_xor(pgdes, pgsrc, packet_size); pgsrc = pgsrc+pgfsize; pgdes = pgdes+pgfsize; } } } }else{ for(j = 0; j < col; ++j){ for(i = 0; i < row; ++i){ val = pmat->data[i*col+j]; if(val == 0) continue; pgsrc = (gfele_t *)(psrc + j*block_size); pgdes = (gfele_t *)(pdes + i*block_size); for(k = 0; k < times; ++k){ region_xor(pgdes, pgsrc, packet_size); pgsrc = pgsrc+pgfsize; pgdes = pgdes+pgfsize; } region_xor(pgdes, pgsrc, rest_size); } } } return 1; }
int mxcoding_pg(unsigned char *pdes, unsigned char *psrc, int block_size, gfmat_t *pmat){ int i, j; int row, col; int bgfsize; gfele_t *pgdes, *pgsrc; gfele_t val; row = pmat->row; col = pmat->col; bgfsize = block_size/sizeof(gfele_t); memset(pdes, 0, row*block_size); pgdes = (gfele_t *)pdes; for(i = 0; i < row; ++i){ pgsrc = (gfele_t *)psrc; for(j = 0; j < col; ++j){ val = pmat->data[i*col+j]; if(val == 1){ region_xor(pgdes, pgsrc, block_size); } pgsrc = pgsrc + bgfsize; } pgdes = pgdes + bgfsize; } return 1; }
void region_dot_product(char **from_bufs, char *to_buf, int *matrix_row, int num_entries, int blocksize) { int i; for (i = 0; i < num_entries; i++) { int mult = matrix_row[i]; if (mult == 1) { region_xor(from_bufs[i], to_buf, blocksize); } else { region_multiply(from_bufs[i], to_buf, mult, 1, blocksize); } } }
// TODO: optimize M2 -> do{}while int mcoding_dpg_ss(unsigned char *pdes, unsigned char *psrc, int block_size, int packet_size, gfmat_t *pmat, gfs_t *gfs){ int row, col; int i, j, k; int times; int rest_size; gfele_t val; unsigned char *ppdes, *ppsrc, *pcom; int *hindex; int shift; gfele_t mask; assert(block_size >= packet_size); row = pmat->row; col = pmat->col; times = block_size/packet_size; rest_size = block_size - times*packet_size; hindex = (int *)malloc(col*sizeof(int)); init_hindex(hindex, pmat); pcom = (unsigned char *)malloc(packet_size); memset(pdes, 0, row*block_size); if(rest_size == 0){ ppsrc = psrc; for(j = 0; j < col; ++j){ for(k = 0; k < times; ++k){ memcpy(pcom, ppsrc, packet_size); for(shift = 0, mask = 1; shift < hindex[j]; ++shift, mask<<=1){ ppdes = pdes + k*packet_size; for(i = 0; i < row; ++i){ val = pmat->data[i*col+j]; if(val&mask){ //regionxor region_xor(ppdes, pcom, packet_size); } ppdes = ppdes + block_size; } gfs->region_mul2((gfele_t *)pcom, packet_size); //region_mul_2_64_w8((gfele_t *)pcom, packet_size); //region_shift_mul_w8(pcom, pcom, 2, packet_size, 0); } ppsrc = ppsrc + packet_size; } } }else{ ppsrc = psrc; for(j = 0; j < col; ++j){ for(k = 0; k < times; ++k){ memcpy(pcom, ppsrc, packet_size); for(shift = 0, mask = 1; shift < hindex[j]; ++shift, mask<<=1){ ppdes = pdes + k*packet_size; for(i = 0; i < row; ++i){ val = pmat->data[i*col+j]; if(val&mask){ //regionxor region_xor(ppdes, pcom, packet_size); } ppdes = ppdes + block_size; } gfs->region_mul2((gfele_t *)pcom, packet_size); //region_mul_2_64_w8((gfele_t *)pcom, packet_size); //region_shift_mul_w8(pcom, pcom, 2, packet_size, 0); } ppsrc = ppsrc + packet_size; } memcpy(pcom, ppsrc, rest_size); for(shift = 0, mask = 1; shift < hindex[j]; ++shift, mask<<=1){ ppdes = pdes+ times*packet_size; for(i = 0; i < row; ++i){ val = pmat->data[i*col+j]; if(val&mask){ //regionxor region_xor(ppdes, pcom, rest_size); } ppdes = ppdes + block_size; } gfs->region_mul2((gfele_t *)pcom, rest_size); //region_mul_2_64_w8((gfele_t *)pcom, rest_size); //region_shift_mul_w8(pcom, pcom, 2, rest_size, 0); } ppsrc = ppsrc + rest_size; } } free(pcom); free(hindex); return 1; }