1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
|
/*
* CDDL HEADER START
*
* The contents of this file are subject to the terms of the
* Common Development and Distribution License (the "License").
* You may not use this file except in compliance with the License.
*
* You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
* or http://www.opensolaris.org/os/licensing.
* See the License for the specific language governing permissions
* and limitations under the License.
*
* When distributing Covered Code, include this CDDL HEADER in each
* file and include the License file at usr/src/OPENSOLARIS.LICENSE.
* If applicable, add the following below this CDDL HEADER, with the
* fields enclosed by brackets "[]" replaced with your own identifying
* information: Portions Copyright [yyyy] [name of copyright owner]
*
* CDDL HEADER END
*/
/*
* Copyright 2009 Sun Microsystems, Inc. All rights reserved.
* Use is subject to license terms.
*/
#ifndef _CRCMODEL_H
#define _CRCMODEL_H
#include <sys/types.h>
#ifdef __cplusplus
extern "C" {
#endif
/*
*
* Start of crcmodel.h
*
*
* Author : Ross Williams (ross@guest.adelaide.edu.au.).
* Date : 3 June 1993.
* Status : Public domain.
*
* Description : This is the header (.h) file for the reference
* implementation of the Rocksoft^tm Model CRC Algorithm. For more
* information on the Rocksoft^tm Model CRC Algorithm, see the document
* titled "A Painless Guide to CRC Error Detection Algorithms" by Ross
* Williams (ross@guest.adelaide.edu.au.). This document is likely to be in
* "ftp.adelaide.edu.au/pub/rocksoft".
*
* Note: Rocksoft is a trademark of Rocksoft Pty Ltd, Adelaide, Australia.
*
*
*
* How to Use This Package
* -----------------------
* Step 1: Declare a variable of type cm_t. Declare another variable
* (p_cm say) of type p_cm_t and initialize it to point to the first
* variable (e.g. p_cm_t p_cm = &cm_t).
*
* Step 2: Assign values to the parameter fields of the structure.
* If you don't know what to assign, see the document cited earlier.
* For example:
* p_cm->cm_width = 16;
* p_cm->cm_poly = 0x8005L;
* p_cm->cm_init = 0L;
* p_cm->cm_refin = TRUE;
* p_cm->cm_refot = TRUE;
* p_cm->cm_xorot = 0L;
* Note: Poly is specified without its top bit (18005 becomes 8005).
* Note: Width is one bit less than the raw poly width.
*
* Step 3: Initialize the instance with a call cm_ini(p_cm);
*
* Step 4: Process zero or more message bytes by placing zero or more
* successive calls to cm_nxt. Example: cm_nxt(p_cm,ch);
*
* Step 5: Extract the CRC value at any time by calling crc = cm_crc(p_cm);
* If the CRC is a 16-bit value, it will be in the bottom 16 bits.
*
*
*
* Design Notes
* ------------
* PORTABILITY: This package has been coded very conservatively so that
* it will run on as many machines as possible. For example, all external
* identifiers have been restricted to 6 characters and all internal ones to
* 8 characters. The prefix cm (for Crc Model) is used as an attempt to avoid
* namespace collisions. This package is endian independent.
*
* EFFICIENCY: This package (and its interface) is not designed for
* speed. The purpose of this package is to act as a well-defined reference
* model for the specification of CRC algorithms. If you want speed, cook up
* a specific table-driven implementation as described in the document cited
* above. This package is designed for validation only; if you have found or
* implemented a CRC algorithm and wish to describe it as a set of parameters
* to the Rocksoft^tm Model CRC Algorithm, your CRC algorithm implementation
* should behave identically to this package under those parameters.
*
*/
/* The following definitions are extracted from my style header file which */
/* would be cumbersome to distribute with this package. The DONE_STYLE is the */
/* idempotence symbol used in my style header file. */
#ifndef DONE_STYLE
typedef unsigned bool;
typedef unsigned char *p_ubyte_;
#ifndef TRUE
#define FALSE 0
#define TRUE 1
#endif
/* Change to the second definition if you don't have prototypes. */
#define P_(A) A
/* #define P_(A) () */
/* Uncomment this definition if you don't have void. */
/* typedef int void; */
#endif
/* CRC Model Abstract Type */
/* ----------------------- */
/* The following type stores the context of an executing instance of the */
/* model algorithm. Most of the fields are model parameters which must be */
/* set before the first initializing call to cm_ini. */
typedef struct
{
int cm_width; /* Parameter: Width in bits [8,32]. */
uint32_t cm_poly; /* Parameter: The algorithm's polynomial. */
uint32_t cm_init; /* Parameter: Initial register value. */
bool cm_refin; /* Parameter: Reflect input bytes? */
bool cm_refot; /* Parameter: Reflect output CRC? */
uint32_t cm_xorot; /* Parameter: XOR this to output CRC. */
uint32_t cm_reg; /* Context: Context during execution. */
} cm_t;
typedef cm_t *p_cm_t;
/* Functions That Implement The Model */
/* ---------------------------------- */
/* The following functions animate the cm_t abstraction. */
void cm_ini P_((p_cm_t p_cm));
/* Initializes the argument CRC model instance. */
/* All parameter fields must be set before calling this. */
void cm_nxt P_((p_cm_t p_cm, int ch));
/* Processes a single message byte [0,255]. */
void cm_blk P_((p_cm_t p_cm, p_ubyte_ blk_adr, uint32_t blk_len));
/* Processes a block of message bytes. */
uint32_t cm_crc P_((p_cm_t p_cm));
/* Returns the CRC value for the message bytes processed so far. */
/* Functions For Table Calculation */
/* ------------------------------- */
/* The following function can be used to calculate a CRC lookup table. */
/* It can also be used at run-time to create or check static tables. */
uint32_t cm_tab P_((p_cm_t p_cm, int index));
/* Returns the i'th entry for the lookup table for the specified algorithm. */
/* The function examines the fields cm_width, cm_poly, cm_refin, and the */
/* argument table index in the range [0,255] and returns the table entry in */
/* the bottom cm_width bytes of the return value. */
#ifdef __cplusplus
}
#endif
#endif /* _CRCMODEL_H */
|