pg: Reduce the inclusion of pg.h
[vpp.git] / src / vnet / llc / llc.h
1 /*
2  * Copyright (c) 2015 Cisco and/or its affiliates.
3  * Licensed under the Apache License, Version 2.0 (the "License");
4  * you may not use this file except in compliance with the License.
5  * You may obtain a copy of the License at:
6  *
7  *     http://www.apache.org/licenses/LICENSE-2.0
8  *
9  * Unless required by applicable law or agreed to in writing, software
10  * distributed under the License is distributed on an "AS IS" BASIS,
11  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12  * See the License for the specific language governing permissions and
13  * limitations under the License.
14  */
15 /*
16  * llc.h: LLC definitions
17  *
18  * Copyright (c) 2008 Eliot Dresselhaus
19  *
20  * Permission is hereby granted, free of charge, to any person obtaining
21  * a copy of this software and associated documentation files (the
22  * "Software"), to deal in the Software without restriction, including
23  * without limitation the rights to use, copy, modify, merge, publish,
24  * distribute, sublicense, and/or sell copies of the Software, and to
25  * permit persons to whom the Software is furnished to do so, subject to
26  * the following conditions:
27  *
28  * The above copyright notice and this permission notice shall be
29  * included in all copies or substantial portions of the Software.
30  *
31  *  THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
32  *  EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
33  *  MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
34  *  NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
35  *  LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
36  *  OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
37  *  WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
38  */
39
40 #ifndef included_llc_h
41 #define included_llc_h
42
43 #include <vnet/vnet.h>
44
45 /* Protocol (SSAP/DSAP) types. */
46 #define foreach_llc_protocol                    \
47   _ (null, 0x0)                                 \
48   _ (sublayer, 0x2)                             \
49   _ (sna_path_control, 0x4)                     \
50   _ (ip4, 0x6)                                  \
51   _ (sna1, 0x8)                                 \
52   _ (sna2, 0xc)                                 \
53   _ (sna3, 0x40)                                \
54   _ (proway_lan, 0x0e)                          \
55   _ (netware1, 0x10)                            \
56   _ (netware2, 0xe0)                            \
57   _ (osi_layer1, 0x14)                          \
58   _ (osi_layer2, 0x20)                          \
59   _ (osi_layer3, 0x34)                          \
60   _ (osi_layer4, 0x54)                          \
61   _ (osi_layer5, 0xfe)                          \
62   _ (bpdu, 0x42)                                \
63   _ (arp, 0x98)                                 \
64   _ (snap, 0xaa)                                \
65   _ (vines1, 0xba)                              \
66   _ (vines2, 0xbc)                              \
67   _ (netbios, 0xf0)                             \
68   _ (global_dsap, 0xff)
69
70 typedef enum
71 {
72 #define _(f,n) LLC_PROTOCOL_##f = n,
73   foreach_llc_protocol
74 #undef _
75 } llc_protocol_t;
76
77 typedef struct
78 {
79 #define LLC_DST_SAP_IS_GROUP (1 << 0)
80 #define LLC_SRC_SAP_IS_RESPONSE (1 << 0)
81   u8 dst_sap, src_sap;
82
83   /* Control byte.
84      [0] 1 => supervisory 0 => information
85      [1] unnumbered frame. */
86   u8 control;
87
88   /* Only present if (control & 3) != 3. */
89   u8 extended_control[0];
90 } llc_header_t;
91
92 always_inline u16
93 llc_header_get_control (llc_header_t * h)
94 {
95   u16 r = h->control;
96   return r | ((((r & 3) != 3) ? h->extended_control[0] : 0) << 8);
97 }
98
99 always_inline u8
100 llc_header_length (llc_header_t * h)
101 {
102   return ((h->control & 3) != 3 ? 4 : 3);
103 }
104
105 typedef struct
106 {
107   /* Name (a c string). */
108   char *name;
109
110   /* LLC protocol (SAP type). */
111   llc_protocol_t protocol;
112
113   /* Node which handles this type. */
114   u32 node_index;
115
116   /* Next index for this type. */
117   u32 next_index;
118 } llc_protocol_info_t;
119
120 #define foreach_llc_error                       \
121   _ (NONE, "no error")                          \
122   _ (UNKNOWN_PROTOCOL, "unknown llc ssap/dsap") \
123   _ (UNKNOWN_CONTROL, "control != 0x3")
124
125 typedef enum
126 {
127 #define _(f,s) LLC_ERROR_##f,
128   foreach_llc_error
129 #undef _
130     LLC_N_ERROR,
131 } llc_error_t;
132
133 typedef struct
134 {
135   vlib_main_t *vlib_main;
136
137   llc_protocol_info_t *protocol_infos;
138
139   /* Hash tables mapping name/protocol to protocol info index. */
140   uword *protocol_info_by_name, *protocol_info_by_protocol;
141
142   /* llc-input next index indexed by protocol. */
143   u8 input_next_by_protocol[256];
144 } llc_main_t;
145
146 always_inline llc_protocol_info_t *
147 llc_get_protocol_info (llc_main_t * m, llc_protocol_t protocol)
148 {
149   uword *p = hash_get (m->protocol_info_by_protocol, protocol);
150   return p ? vec_elt_at_index (m->protocol_infos, p[0]) : 0;
151 }
152
153 extern llc_main_t llc_main;
154
155 /* Register given node index to take input for given llc type. */
156 void
157 llc_register_input_protocol (vlib_main_t * vm,
158                              llc_protocol_t protocol, u32 node_index);
159
160 format_function_t format_llc_protocol;
161 format_function_t format_llc_header;
162 format_function_t format_llc_header_with_length;
163
164 /* Parse llc protocol as 0xXXXX or protocol name. */
165 unformat_function_t unformat_llc_protocol;
166
167 /* Parse llc header. */
168 unformat_function_t unformat_llc_header;
169 unformat_function_t unformat_pg_llc_header;
170
171 #endif /* included_llc_h */
172
173 /*
174  * fd.io coding-style-patch-verification: ON
175  *
176  * Local Variables:
177  * eval: (c-set-style "gnu")
178  * End:
179  */