6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker/*
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker * CDDL HEADER START
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker *
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker * The contents of this file are subject to the terms of the
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker * Common Development and Distribution License (the "License").
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker * You may not use this file except in compliance with the License.
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker *
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker * or http://www.opensolaris.org/os/licensing.
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker * See the License for the specific language governing permissions
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker * and limitations under the License.
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker *
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker * When distributing Covered Code, include this CDDL HEADER in each
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker * If applicable, add the following below this CDDL HEADER, with the
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker * fields enclosed by brackets "[]" replaced with your own identifying
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker * information: Portions Copyright [yyyy] [name of copyright owner]
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker *
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker * CDDL HEADER END
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker */
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker/*
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker * Copyright 2009 Sun Microsystems, Inc. All rights reserved.
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker * Use is subject to license terms.
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker */
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker#ifndef _CRCMODEL_H
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker#define _CRCMODEL_H
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker#ifdef SOLARIS_UNIX
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker#include <sys/types.h>
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker#else
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panickertypedef long uint32_t;
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker#endif
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker#ifdef __cplusplus
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panickerextern "C" {
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker#endif
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker/*
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker *
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker * Start of crcmodel.h
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker *
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker *
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker * Author : Ross Williams (ross@guest.adelaide.edu.au.).
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker * Date : 3 June 1993.
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker * Status : Public domain.
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker *
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker * Description : This is the header (.h) file for the reference
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker * implementation of the Rocksoft^tm Model CRC Algorithm. For more
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker * information on the Rocksoft^tm Model CRC Algorithm, see the document
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker * titled "A Painless Guide to CRC Error Detection Algorithms" by Ross
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker * Williams (ross@guest.adelaide.edu.au.). This document is likely to be in
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker * "ftp.adelaide.edu.au/pub/rocksoft".
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker *
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker * Note: Rocksoft is a trademark of Rocksoft Pty Ltd, Adelaide, Australia.
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker *
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker *
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker *
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker * How to Use This Package
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker * -----------------------
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker * Step 1: Declare a variable of type cm_t. Declare another variable
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker * (p_cm say) of type p_cm_t and initialize it to point to the first
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker * variable (e.g. p_cm_t p_cm = &cm_t).
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker *
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker * Step 2: Assign values to the parameter fields of the structure.
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker * If you don't know what to assign, see the document cited earlier.
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker * For example:
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker * p_cm->cm_width = 16;
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker * p_cm->cm_poly = 0x8005L;
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker * p_cm->cm_init = 0L;
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker * p_cm->cm_refin = TRUE;
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker * p_cm->cm_refot = TRUE;
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker * p_cm->cm_xorot = 0L;
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker * Note: Poly is specified without its top bit (18005 becomes 8005).
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker * Note: Width is one bit less than the raw poly width.
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker *
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker * Step 3: Initialize the instance with a call cm_ini(p_cm);
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker *
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker * Step 4: Process zero or more message bytes by placing zero or more
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker * successive calls to cm_nxt. Example: cm_nxt(p_cm,ch);
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker *
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker * Step 5: Extract the CRC value at any time by calling crc = cm_crc(p_cm);
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker * If the CRC is a 16-bit value, it will be in the bottom 16 bits.
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker *
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker *
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker *
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker * Design Notes
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker * ------------
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker * PORTABILITY: This package has been coded very conservatively so that
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker * it will run on as many machines as possible. For example, all external
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker * identifiers have been restricted to 6 characters and all internal ones to
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker * 8 characters. The prefix cm (for Crc Model) is used as an attempt to avoid
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker * namespace collisions. This package is endian independent.
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker *
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker * EFFICIENCY: This package (and its interface) is not designed for
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker * speed. The purpose of this package is to act as a well-defined reference
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker * model for the specification of CRC algorithms. If you want speed, cook up
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker * a specific table-driven implementation as described in the document cited
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker * above. This package is designed for validation only; if you have found or
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker * implemented a CRC algorithm and wish to describe it as a set of parameters
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker * to the Rocksoft^tm Model CRC Algorithm, your CRC algorithm implementation
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker * should behave identically to this package under those parameters.
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker *
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker */
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker/* The following definitions are extracted from my style header file which */
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker/* would be cumbersome to distribute with this package. The DONE_STYLE is the */
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker/* idempotence symbol used in my style header file. */
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker#ifndef DONE_STYLE
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panickertypedef unsigned bool;
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panickertypedef unsigned char *p_ubyte_;
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker#ifndef TRUE
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker#define FALSE 0
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker#define TRUE 1
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker#endif
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker/* Change to the second definition if you don't have prototypes. */
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker#define P_(A) A
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker/* #define P_(A) () */
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker/* Uncomment this definition if you don't have void. */
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker/* typedef int void; */
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker#endif
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker/* CRC Model Abstract Type */
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker/* ----------------------- */
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker/* The following type stores the context of an executing instance of the */
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker/* model algorithm. Most of the fields are model parameters which must be */
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker/* set before the first initializing call to cm_ini. */
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panickertypedef struct
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker{
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker int cm_width; /* Parameter: Width in bits [8,32]. */
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker uint32_t cm_poly; /* Parameter: The algorithm's polynomial. */
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker uint32_t cm_init; /* Parameter: Initial register value. */
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker bool cm_refin; /* Parameter: Reflect input bytes? */
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker bool cm_refot; /* Parameter: Reflect output CRC? */
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker uint32_t cm_xorot; /* Parameter: XOR this to output CRC. */
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker uint32_t cm_reg; /* Context: Context during execution. */
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker} cm_t;
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panickertypedef cm_t *p_cm_t;
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker/* Functions That Implement The Model */
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker/* ---------------------------------- */
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker/* The following functions animate the cm_t abstraction. */
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panickervoid cm_ini P_((p_cm_t p_cm));
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker/* Initializes the argument CRC model instance. */
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker/* All parameter fields must be set before calling this. */
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panickervoid cm_nxt P_((p_cm_t p_cm, int ch));
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker/* Processes a single message byte [0,255]. */
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panickervoid cm_blk P_((p_cm_t p_cm, p_ubyte_ blk_adr, uint32_t blk_len));
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker/* Processes a block of message bytes. */
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panickeruint32_t cm_crc P_((p_cm_t p_cm));
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker/* Returns the CRC value for the message bytes processed so far. */
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker/* Functions For Table Calculation */
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker/* ------------------------------- */
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker/* The following function can be used to calculate a CRC lookup table. */
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker/* It can also be used at run-time to create or check static tables. */
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panickeruint32_t cm_tab P_((p_cm_t p_cm, int index));
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker/* Returns the i'th entry for the lookup table for the specified algorithm. */
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker/* The function examines the fields cm_width, cm_poly, cm_refin, and the */
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker/* argument table index in the range [0,255] and returns the table entry in */
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker/* the bottom cm_width bytes of the return value. */
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker#ifdef __cplusplus
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker}
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker#endif
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker
6bbe05905a1c10a2703f95fb4912eb14b87f6670Sundeep Panicker#endif /* _CRCMODEL_H */