]> CyberLeo.Net >> Repos - FreeBSD/releng/10.0.git/blob - sys/contrib/ngatm/netnatm/msg/unimsglib.h
- Copy stable/10 (r259064) to releng/10.0 as part of the
[FreeBSD/releng/10.0.git] / sys / contrib / ngatm / netnatm / msg / unimsglib.h
1 /*
2  * Copyright (c) 1996-2003
3  *      Fraunhofer Institute for Open Communication Systems (FhG Fokus).
4  *      All rights reserved.
5  *
6  * Redistribution and use in source and binary forms, with or without
7  * modification, are permitted provided that the following conditions
8  * are met:
9  * 1. Redistributions of source code must retain the above copyright
10  *    notice, this list of conditions and the following disclaimer.
11  * 2. Redistributions in binary form must reproduce the above copyright
12  *    notice, this list of conditions and the following disclaimer in the
13  *    documentation and/or other materials provided with the distribution.
14  *
15  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
16  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
17  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
18  * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
19  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
20  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
21  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
22  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
23  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
24  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
25  * SUCH DAMAGE.
26  *
27  * Author: Hartmut Brandt <harti@freebsd.org>
28  *
29  * $Begemot: libunimsg/netnatm/msg/unimsglib.h,v 1.6 2004/07/08 08:22:07 brandt Exp $
30  */
31 #ifndef _NETNATM_MSG_UNIMSGLIB_H_
32 #define _NETNATM_MSG_UNIMSGLIB_H_
33
34 #include <netnatm/msg/uni_config.h>
35
36 struct uni_msg;
37
38 enum uni_ierr_type {
39         UNI_IERR_UNK,   /* unknown IE */
40         UNI_IERR_LEN,   /* length error */
41         UNI_IERR_BAD,   /* content error */
42         UNI_IERR_ACC,   /* access element content error */
43         UNI_IERR_MIS,   /* mandatory IE missing (not used here) */
44 };
45
46 struct uni_ierr {
47         enum uni_ierr_type      err;    /* what error */
48         enum uni_ieact          act;    /* the action indicator */
49         u_int                   ie:8;   /* the ie type */
50         u_int                   man:1;  /* mandatory flag */
51         u_int                   epref:1;/* Q.2971 9.5.3.2.1 low-pri epref */
52 };
53
54 /*
55  * Context buffer. Needed to reduce number of arguments to routines.
56  */
57 struct unicx {
58         /*
59          * globals for error handling
60          */
61         u_int           errcnt;         /* number of bad IEs */
62         struct uni_ierr err[UNI_MAX_ERRIE]; /* the errors */
63
64         int             q2932;          /* Enable GFP */
65         int             pnni;           /* Enable PNNI */
66
67         int             git_hard;       /* do hard check on GIT IE */
68         int             bearer_hard;    /* do hard check on BEARER IE */
69         int             cause_hard;     /* do hard check on cause */
70
71         int             multiline;      /* printing mode */
72         u_int           tabsiz;         /* tabulation size */
73
74         /*
75          * Internal context of library -- don't touch
76          */
77         struct uni_ie_repeat    repeat; /* repeat IE during decoding */
78         enum uni_ietype         ielast; /* last IE seen for repeat handling */
79
80         const char              *prefix[20];
81         u_int                   nprefix;
82         int                     doindent;
83         char                    *buf;
84         size_t                  bufsiz;
85         u_int                   indent;         /* indentation */
86         int                     dont_init;
87 };
88
89 /*
90  * Functions for all messages
91  */
92 void uni_print_cref(char *, size_t, const struct uni_cref *, struct unicx *);
93 void uni_print_msghdr(char *, size_t, const struct uni_msghdr *, struct unicx *);
94 void uni_print(char *, size_t, const struct uni_all *, struct unicx *);
95 void uni_print_msg(char *, size_t, u_int _mtype, const union uni_msgall *,
96     struct unicx *);
97 int uni_encode(struct uni_msg *, struct uni_all *, struct unicx *);
98 int uni_decode(struct uni_msg *, struct uni_all *, struct unicx *);
99
100 int uni_decode_head(struct uni_msg *, struct uni_all *, struct unicx *);
101 int uni_decode_body(struct uni_msg *, struct uni_all *, struct unicx *);
102
103 int uni_encode_msg_hdr(struct uni_msg *, struct uni_msghdr *, enum uni_msgtype,
104     struct unicx *, int *);
105
106
107 /*
108  * Functions for all information elements
109  */
110 void uni_print_ie(char *, size_t, enum uni_ietype, const union uni_ieall *,
111     struct unicx *);
112 int uni_check_ie(enum uni_ietype, union uni_ieall *, struct unicx *);
113 int uni_encode_ie(enum uni_ietype, struct uni_msg *, union uni_ieall *,
114     struct unicx *);
115 int uni_decode_ie_hdr(enum uni_ietype *, struct uni_iehdr *, struct uni_msg *,
116     struct unicx *, u_int *);
117 int uni_encode_ie_hdr(struct uni_msg *, enum uni_ietype, struct uni_iehdr *,
118     u_int, struct unicx *);
119 int uni_decode_ie_body(enum uni_ietype, union uni_ieall *, struct uni_msg *,
120     u_int, struct unicx *);
121
122
123 /*
124  * Context handling
125  */
126 void uni_initcx(struct unicx *);
127 void uni_print_cx(char *, size_t, struct unicx *);
128
129 #define UNI_SAVE_IERR(CX, IETYPE, ACT, ERRCODE)                         \
130         (((CX)->errcnt < UNI_MAX_ERRIE) ?                               \
131          ((CX)->err[(CX)->errcnt].ie = (IETYPE),                        \
132           (CX)->err[(CX)->errcnt].act = (ACT),                          \
133           (CX)->err[(CX)->errcnt].err = (ERRCODE),                      \
134           (CX)->err[(CX)->errcnt].man = 0,                              \
135           (CX)->errcnt++,                                               \
136           1) : 0)
137
138 /*
139  * Traffic classification
140  */
141 enum uni_traffic_class {
142         UNI_TRAFFIC_CBR1,
143         UNI_TRAFFIC_CBR2,
144         UNI_TRAFFIC_CBR3,
145         UNI_TRAFFIC_rtVBR1,
146         UNI_TRAFFIC_rtVBR2,
147         UNI_TRAFFIC_rtVBR3,
148         UNI_TRAFFIC_rtVBR4,
149         UNI_TRAFFIC_rtVBR5,
150         UNI_TRAFFIC_rtVBR6,
151         UNI_TRAFFIC_nrtVBR1,
152         UNI_TRAFFIC_nrtVBR2,
153         UNI_TRAFFIC_nrtVBR3,
154         UNI_TRAFFIC_nrtVBR4,
155         UNI_TRAFFIC_nrtVBR5,
156         UNI_TRAFFIC_nrtVBR6,
157         UNI_TRAFFIC_ABR,
158         UNI_TRAFFIC_UBR1,
159         UNI_TRAFFIC_UBR2,
160 };
161
162 /* classify traffic */
163 int uni_classify_traffic(const struct uni_ie_bearer *,
164     const struct uni_ie_traffic *,
165     enum uni_traffic_class *, enum uni_traffic_class *,
166     char *, size_t);
167
168 #endif