1*288bf522SAndroid Build Coastguard Worker /*
2*288bf522SAndroid Build Coastguard Worker * Copyright (C) 2015 The Android Open Source Project
3*288bf522SAndroid Build Coastguard Worker *
4*288bf522SAndroid Build Coastguard Worker * Licensed under the Apache License, Version 2.0 (the "License");
5*288bf522SAndroid Build Coastguard Worker * you may not use this file except in compliance with the License.
6*288bf522SAndroid Build Coastguard Worker * You may obtain a copy of the License at
7*288bf522SAndroid Build Coastguard Worker *
8*288bf522SAndroid Build Coastguard Worker * http://www.apache.org/licenses/LICENSE-2.0
9*288bf522SAndroid Build Coastguard Worker *
10*288bf522SAndroid Build Coastguard Worker * Unless required by applicable law or agreed to in writing, software
11*288bf522SAndroid Build Coastguard Worker * distributed under the License is distributed on an "AS IS" BASIS,
12*288bf522SAndroid Build Coastguard Worker * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13*288bf522SAndroid Build Coastguard Worker * See the License for the specific language governing permissions and
14*288bf522SAndroid Build Coastguard Worker * limitations under the License.
15*288bf522SAndroid Build Coastguard Worker */
16*288bf522SAndroid Build Coastguard Worker
17*288bf522SAndroid Build Coastguard Worker #include <inttypes.h>
18*288bf522SAndroid Build Coastguard Worker #include <errno.h>
19*288bf522SAndroid Build Coastguard Worker #include <sys/types.h>
20*288bf522SAndroid Build Coastguard Worker #include <sys/stat.h>
21*288bf522SAndroid Build Coastguard Worker #include <fcntl.h>
22*288bf522SAndroid Build Coastguard Worker #include <stdio.h>
23*288bf522SAndroid Build Coastguard Worker #include <stdlib.h>
24*288bf522SAndroid Build Coastguard Worker #include <unistd.h>
25*288bf522SAndroid Build Coastguard Worker #include <string.h>
26*288bf522SAndroid Build Coastguard Worker #include <fec.h>
27*288bf522SAndroid Build Coastguard Worker
28*288bf522SAndroid Build Coastguard Worker #define FEC_RSM 255
29*288bf522SAndroid Build Coastguard Worker #define FEC_ROOTS 16
30*288bf522SAndroid Build Coastguard Worker #define FEC_RSN (FEC_RSM - FEC_ROOTS)
31*288bf522SAndroid Build Coastguard Worker #define FEC_PARAMS(roots) \
32*288bf522SAndroid Build Coastguard Worker 8, 0x11d, 0, 1, (roots), 0
33*288bf522SAndroid Build Coastguard Worker
main()34*288bf522SAndroid Build Coastguard Worker int main()
35*288bf522SAndroid Build Coastguard Worker {
36*288bf522SAndroid Build Coastguard Worker uint8_t data[FEC_RSM];
37*288bf522SAndroid Build Coastguard Worker uint8_t dupl[FEC_RSM];
38*288bf522SAndroid Build Coastguard Worker uint8_t corr[FEC_RSM];
39*288bf522SAndroid Build Coastguard Worker int i, rc, neras, errors;
40*288bf522SAndroid Build Coastguard Worker int erasures[FEC_RSM];
41*288bf522SAndroid Build Coastguard Worker void *rs;
42*288bf522SAndroid Build Coastguard Worker
43*288bf522SAndroid Build Coastguard Worker memset(data, 0x00, sizeof(data));
44*288bf522SAndroid Build Coastguard Worker memset(corr, 0x00, sizeof(corr));
45*288bf522SAndroid Build Coastguard Worker
46*288bf522SAndroid Build Coastguard Worker rs = init_rs_char(FEC_PARAMS(FEC_ROOTS));
47*288bf522SAndroid Build Coastguard Worker
48*288bf522SAndroid Build Coastguard Worker if (!rs) {
49*288bf522SAndroid Build Coastguard Worker perror("init_rs_char");
50*288bf522SAndroid Build Coastguard Worker exit(1);
51*288bf522SAndroid Build Coastguard Worker }
52*288bf522SAndroid Build Coastguard Worker
53*288bf522SAndroid Build Coastguard Worker encode_rs_char(rs, data, &corr[FEC_RSN]);
54*288bf522SAndroid Build Coastguard Worker
55*288bf522SAndroid Build Coastguard Worker for (neras = 1; neras <= FEC_ROOTS; ++neras) {
56*288bf522SAndroid Build Coastguard Worker printf("%d errors\n", neras);
57*288bf522SAndroid Build Coastguard Worker
58*288bf522SAndroid Build Coastguard Worker for (i = 0; i < neras; ++i) {
59*288bf522SAndroid Build Coastguard Worker corr[i] = 0xFD;
60*288bf522SAndroid Build Coastguard Worker erasures[i] = i;
61*288bf522SAndroid Build Coastguard Worker }
62*288bf522SAndroid Build Coastguard Worker
63*288bf522SAndroid Build Coastguard Worker memcpy(dupl, corr, sizeof(corr));
64*288bf522SAndroid Build Coastguard Worker
65*288bf522SAndroid Build Coastguard Worker rc = decode_rs_char(rs, corr, NULL, 0);
66*288bf522SAndroid Build Coastguard Worker
67*288bf522SAndroid Build Coastguard Worker printf("\tno erasures: %d\n", rc);
68*288bf522SAndroid Build Coastguard Worker
69*288bf522SAndroid Build Coastguard Worker errors = 0;
70*288bf522SAndroid Build Coastguard Worker for (i = 0; i < FEC_RSN; ++i) {
71*288bf522SAndroid Build Coastguard Worker if (corr[i] != 0x00) {
72*288bf522SAndroid Build Coastguard Worker printf("\t\terror at %d (%02x)\n", i, corr[i]);
73*288bf522SAndroid Build Coastguard Worker ++errors;
74*288bf522SAndroid Build Coastguard Worker }
75*288bf522SAndroid Build Coastguard Worker }
76*288bf522SAndroid Build Coastguard Worker printf("\t\t%d errors in output\n", errors);
77*288bf522SAndroid Build Coastguard Worker
78*288bf522SAndroid Build Coastguard Worker rc = decode_rs_char(rs, dupl, erasures, neras);
79*288bf522SAndroid Build Coastguard Worker
80*288bf522SAndroid Build Coastguard Worker printf("\terasures: %d\n", rc);
81*288bf522SAndroid Build Coastguard Worker
82*288bf522SAndroid Build Coastguard Worker errors = 0;
83*288bf522SAndroid Build Coastguard Worker for (i = 0; i < FEC_RSN; ++i) {
84*288bf522SAndroid Build Coastguard Worker if (dupl[i] != 0x00) {
85*288bf522SAndroid Build Coastguard Worker printf("\t\terror at %d (%02x)\n", i, dupl[i]);
86*288bf522SAndroid Build Coastguard Worker ++errors;
87*288bf522SAndroid Build Coastguard Worker }
88*288bf522SAndroid Build Coastguard Worker }
89*288bf522SAndroid Build Coastguard Worker printf("\t\t%d errors in output\n", errors);
90*288bf522SAndroid Build Coastguard Worker }
91*288bf522SAndroid Build Coastguard Worker
92*288bf522SAndroid Build Coastguard Worker exit(0);
93*288bf522SAndroid Build Coastguard Worker }
94