/** The size of the \a idx and the \a data arrays below. */
int num_slices;
/** Array of indices of the received slices. */
/** The size of the \a idx and the \a data arrays below. */
int num_slices;
/** Array of indices of the received slices. */
- fg->idx = NULL;
- fg->num_slices = 0;
- memset(&fg->h, 0, sizeof(struct fec_header));
- fg->num_received_slices = 0;
+ memset(fg, 0, sizeof(*fg));
"(contains %d slices)\n", oldest->h.group_num,
oldest->num_received_slices);
if (oldest == pfd->first_complete_group)
"(contains %d slices)\n", oldest->h.group_num,
oldest->num_received_slices);
if (oldest == pfd->first_complete_group)
- PARA_DEBUG_LOG("group %d complete, ignoring slice %d\n",
- fg->h.group_num, fg->h.slice_num);
- fg->num_received_slices++;
+ PARA_DEBUG_LOG("group %u complete, ignoring slice %d\n",
+ fg->h.group_num, slice_num);
if (fg->num_slices == 0) {
fg->num_slices = fg->h.slices_per_group;
fg->idx = para_malloc(fg->num_slices * sizeof(int));
if (fg->num_slices == 0) {
fg->num_slices = fg->h.slices_per_group;
fg->idx = para_malloc(fg->num_slices * sizeof(int));
+ /* Check if we already have this slice. */
+ if (test_and_set_slice_bit(fg, slice_num)) {
+ PARA_INFO_LOG("ignoring duplicate slice %u:%d\n", fg->h.group_num,
+ slice_num);
+ return 0;
+ }
fg->idx[r] = slice_num;
fg->data[r] = para_malloc(fg->h.slice_bytes);
memcpy(fg->data[r], buf, fg->h.slice_bytes);
fg->idx[r] = slice_num;
fg->data[r] = para_malloc(fg->h.slice_bytes);
memcpy(fg->data[r], buf, fg->h.slice_bytes);
size_t written, need;
struct private_fecdec_data *pfd = fn->private_data;
enum fec_group_usability u = group_is_usable(fg, pfd);
size_t written, need;
struct private_fecdec_data *pfd = fn->private_data;
enum fec_group_usability u = group_is_usable(fg, pfd);
fg->h.data_slices_per_group);
ret = fec_decode(pfd->fec, fg->data, fg->idx, sb);
if (ret < 0)
fg->h.data_slices_per_group);
ret = fec_decode(pfd->fec, fg->data, fg->idx, sb);
if (ret < 0)
fg->h.group_num, fg->h.group_bytes,
fg->h.data_slices_per_group * sb);
need = (fg->h.data_slices_per_group - i) * sb;
if (need > btr_pool_unused(pfd->btrp))
return -E_FECDEC_OVERRUN;
btr_pool_get_buffer(pfd->btrp, &buf);
fg->h.group_num, fg->h.group_bytes,
fg->h.data_slices_per_group * sb);
need = (fg->h.data_slices_per_group - i) * sb;
if (need > btr_pool_unused(pfd->btrp))
return -E_FECDEC_OVERRUN;
btr_pool_get_buffer(pfd->btrp, &buf);
btr_copy(fg->data[i], n, pfd->btrp, fn->btrn);
written += n;
}
btr_copy(fg->data[i], n, pfd->btrp, fn->btrn);
written += n;
}
btr_copy(fg->data[i], n, pfd->btrp, fn->btrn);
written += n;
}
btr_copy(fg->data[i], n, pfd->btrp, fn->btrn);
written += n;
}
/* decode and clear the first group */
ret = decode_group(pfd->first_complete_group, fn);
if (ret < 0)
/* decode and clear the first group */
ret = decode_group(pfd->first_complete_group, fn);
if (ret < 0)
-/**
- * The init function of the fecdec filter.
- *
- * \param f Struct to initialize.
- */
-void fecdec_filter_init(struct filter *f)
-{
- f->close = fecdec_close;
- f->open = fecdec_open;
- f->pre_select = generic_filter_pre_select;
- f->post_select = fecdec_post_select;
-}
+const struct filter lsg_filter_cmd_com_fecdec_user_data = {
+ .open = fecdec_open,
+ .pre_select = generic_filter_pre_select,
+ .post_select = fecdec_post_select,
+ .close = fecdec_close,
+};