169 lines
5.3 KiB
C
169 lines
5.3 KiB
C
/*
|
|
* Copyright (c) 1996-2003
|
|
* Fraunhofer Institute for Open Communication Systems (FhG Fokus).
|
|
* All rights reserved.
|
|
*
|
|
* Redistribution and use in source and binary forms, with or without
|
|
* modification, are permitted provided that the following conditions
|
|
* are met:
|
|
* 1. Redistributions of source code must retain the above copyright
|
|
* notice, this list of conditions and the following disclaimer.
|
|
* 2. Redistributions in binary form must reproduce the above copyright
|
|
* notice, this list of conditions and the following disclaimer in the
|
|
* documentation and/or other materials provided with the distribution.
|
|
*
|
|
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
|
|
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
|
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
|
* ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
|
|
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
|
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
|
|
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
|
|
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
|
|
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
|
|
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
|
|
* SUCH DAMAGE.
|
|
*
|
|
* Author: Hartmut Brandt <harti@freebsd.org>
|
|
*
|
|
* $Begemot: libunimsg/netnatm/msg/unimsglib.h,v 1.6 2004/07/08 08:22:07 brandt Exp $
|
|
*/
|
|
#ifndef _NETNATM_MSG_UNIMSGLIB_H_
|
|
#define _NETNATM_MSG_UNIMSGLIB_H_
|
|
|
|
#include <netnatm/msg/uni_config.h>
|
|
|
|
struct uni_msg;
|
|
|
|
enum uni_ierr_type {
|
|
UNI_IERR_UNK, /* unknown IE */
|
|
UNI_IERR_LEN, /* length error */
|
|
UNI_IERR_BAD, /* content error */
|
|
UNI_IERR_ACC, /* access element content error */
|
|
UNI_IERR_MIS, /* mandatory IE missing (not used here) */
|
|
};
|
|
|
|
struct uni_ierr {
|
|
enum uni_ierr_type err; /* what error */
|
|
enum uni_ieact act; /* the action indicator */
|
|
u_int ie:8; /* the ie type */
|
|
u_int man:1; /* mandatory flag */
|
|
u_int epref:1;/* Q.2971 9.5.3.2.1 low-pri epref */
|
|
};
|
|
|
|
/*
|
|
* Context buffer. Needed to reduce number of arguments to routines.
|
|
*/
|
|
struct unicx {
|
|
/*
|
|
* globals for error handling
|
|
*/
|
|
u_int errcnt; /* number of bad IEs */
|
|
struct uni_ierr err[UNI_MAX_ERRIE]; /* the errors */
|
|
|
|
int q2932; /* Enable GFP */
|
|
int pnni; /* Enable PNNI */
|
|
|
|
int git_hard; /* do hard check on GIT IE */
|
|
int bearer_hard; /* do hard check on BEARER IE */
|
|
int cause_hard; /* do hard check on cause */
|
|
|
|
int multiline; /* printing mode */
|
|
u_int tabsiz; /* tabulation size */
|
|
|
|
/*
|
|
* Internal context of library -- don't touch
|
|
*/
|
|
struct uni_ie_repeat repeat; /* repeat IE during decoding */
|
|
enum uni_ietype ielast; /* last IE seen for repeat handling */
|
|
|
|
const char *prefix[20];
|
|
u_int nprefix;
|
|
int doindent;
|
|
char *buf;
|
|
size_t bufsiz;
|
|
u_int indent; /* indentation */
|
|
int dont_init;
|
|
};
|
|
|
|
/*
|
|
* Functions for all messages
|
|
*/
|
|
void uni_print_cref(char *, size_t, const struct uni_cref *, struct unicx *);
|
|
void uni_print_msghdr(char *, size_t, const struct uni_msghdr *, struct unicx *);
|
|
void uni_print(char *, size_t, const struct uni_all *, struct unicx *);
|
|
void uni_print_msg(char *, size_t, u_int _mtype, const union uni_msgall *,
|
|
struct unicx *);
|
|
int uni_encode(struct uni_msg *, struct uni_all *, struct unicx *);
|
|
int uni_decode(struct uni_msg *, struct uni_all *, struct unicx *);
|
|
|
|
int uni_decode_head(struct uni_msg *, struct uni_all *, struct unicx *);
|
|
int uni_decode_body(struct uni_msg *, struct uni_all *, struct unicx *);
|
|
|
|
int uni_encode_msg_hdr(struct uni_msg *, struct uni_msghdr *, enum uni_msgtype,
|
|
struct unicx *, int *);
|
|
|
|
|
|
/*
|
|
* Functions for all information elements
|
|
*/
|
|
void uni_print_ie(char *, size_t, enum uni_ietype, const union uni_ieall *,
|
|
struct unicx *);
|
|
int uni_check_ie(enum uni_ietype, union uni_ieall *, struct unicx *);
|
|
int uni_encode_ie(enum uni_ietype, struct uni_msg *, union uni_ieall *,
|
|
struct unicx *);
|
|
int uni_decode_ie_hdr(enum uni_ietype *, struct uni_iehdr *, struct uni_msg *,
|
|
struct unicx *, u_int *);
|
|
int uni_encode_ie_hdr(struct uni_msg *, enum uni_ietype, struct uni_iehdr *,
|
|
u_int, struct unicx *);
|
|
int uni_decode_ie_body(enum uni_ietype, union uni_ieall *, struct uni_msg *,
|
|
u_int, struct unicx *);
|
|
|
|
|
|
/*
|
|
* Context handling
|
|
*/
|
|
void uni_initcx(struct unicx *);
|
|
void uni_print_cx(char *, size_t, struct unicx *);
|
|
|
|
#define UNI_SAVE_IERR(CX, IETYPE, ACT, ERRCODE) \
|
|
(((CX)->errcnt < UNI_MAX_ERRIE) ? \
|
|
((CX)->err[(CX)->errcnt].ie = (IETYPE), \
|
|
(CX)->err[(CX)->errcnt].act = (ACT), \
|
|
(CX)->err[(CX)->errcnt].err = (ERRCODE), \
|
|
(CX)->err[(CX)->errcnt].man = 0, \
|
|
(CX)->errcnt++, \
|
|
1) : 0)
|
|
|
|
/*
|
|
* Traffic classification
|
|
*/
|
|
enum uni_traffic_class {
|
|
UNI_TRAFFIC_CBR1,
|
|
UNI_TRAFFIC_CBR2,
|
|
UNI_TRAFFIC_CBR3,
|
|
UNI_TRAFFIC_rtVBR1,
|
|
UNI_TRAFFIC_rtVBR2,
|
|
UNI_TRAFFIC_rtVBR3,
|
|
UNI_TRAFFIC_rtVBR4,
|
|
UNI_TRAFFIC_rtVBR5,
|
|
UNI_TRAFFIC_rtVBR6,
|
|
UNI_TRAFFIC_nrtVBR1,
|
|
UNI_TRAFFIC_nrtVBR2,
|
|
UNI_TRAFFIC_nrtVBR3,
|
|
UNI_TRAFFIC_nrtVBR4,
|
|
UNI_TRAFFIC_nrtVBR5,
|
|
UNI_TRAFFIC_nrtVBR6,
|
|
UNI_TRAFFIC_ABR,
|
|
UNI_TRAFFIC_UBR1,
|
|
UNI_TRAFFIC_UBR2,
|
|
};
|
|
|
|
/* classify traffic */
|
|
int uni_classify_traffic(const struct uni_ie_bearer *,
|
|
const struct uni_ie_traffic *,
|
|
enum uni_traffic_class *, enum uni_traffic_class *,
|
|
char *, size_t);
|
|
|
|
#endif
|