Line data Source code
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 : * snap.h: SNAP 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_snap_h
41 : #define included_snap_h
42 :
43 : #include <vnet/vnet.h>
44 :
45 : #define foreach_ieee_oui \
46 : _ (0x000000, ethernet) \
47 : _ (0x00000c, cisco)
48 :
49 : typedef enum
50 : {
51 : #define _(n,f) IEEE_OUI_##f = n,
52 : foreach_ieee_oui
53 : #undef _
54 : } ieee_oui_t;
55 :
56 : #define foreach_snap_cisco_protocol \
57 : _ (0x0102, drip) \
58 : _ (0x0104, port_aggregation_protocol) \
59 : _ (0x0105, mls_hello) \
60 : _ (0x010b, per_vlan_spanning_tree) \
61 : _ (0x010c, vlan_bridge) \
62 : _ (0x0111, unidirectional_link_detection) \
63 : _ (0x2000, cdp) \
64 : _ (0x2001, cgmp) \
65 : _ (0x2003, vtp) \
66 : _ (0x2004, dtp) \
67 : _ (0x200a, stp_uplink_fast)
68 :
69 : typedef enum
70 : {
71 : #define _(n,f) SNAP_cisco_##f = n,
72 : foreach_snap_cisco_protocol
73 : #undef _
74 : } snap_cisco_protocol_t;
75 :
76 : typedef union
77 : {
78 : /* *INDENT-OFF* */
79 : CLIB_PACKED (struct {
80 : /* OUI: organization unique identifier. */
81 : u8 oui[3];
82 :
83 : /* Per-OUI protocol. */
84 : u16 protocol;
85 : });
86 : /* *INDENT-ON* */
87 :
88 : u8 as_u8[5];
89 : } snap_header_t;
90 :
91 : typedef struct
92 : {
93 : u32 oui;
94 : u32 protocol;
95 : } snap_oui_and_protocol_t;
96 :
97 : typedef struct
98 : {
99 : /* Name vector string. */
100 : u8 *name;
101 :
102 : snap_oui_and_protocol_t oui_and_protocol;
103 :
104 : /* Node which handles this type. */
105 : u32 node_index;
106 :
107 : /* snap-input next index for this type. */
108 : u32 next_index;
109 : } snap_protocol_info_t;
110 :
111 : always_inline void
112 0 : snap_header_set_protocol (snap_header_t * h, snap_oui_and_protocol_t * p)
113 : {
114 0 : u16 protocol = p->protocol;
115 0 : u32 oui = p->oui;
116 0 : h->protocol = clib_host_to_net_u16 (protocol);
117 0 : h->oui[0] = (oui >> 16) & 0xff;
118 0 : h->oui[1] = (oui >> 8) & 0xff;
119 0 : h->oui[2] = (oui >> 0) & 0xff;
120 0 : }
121 :
122 : #define foreach_snap_error \
123 : _ (NONE, "no error") \
124 : _ (UNKNOWN_PROTOCOL, "unknown oui/snap protocol")
125 :
126 : typedef enum
127 : {
128 : #define _(f,s) SNAP_ERROR_##f,
129 : foreach_snap_error
130 : #undef _
131 : SNAP_N_ERROR,
132 : } snap_error_t;
133 :
134 : typedef struct
135 : {
136 : vlib_main_t *vlib_main;
137 :
138 : /* Vector of known SNAP oui/protocol pairs. */
139 : snap_protocol_info_t *protocols;
140 :
141 : /* Hash table mapping oui/protocol to protocol index. */
142 : mhash_t protocol_hash;
143 :
144 : /* Hash table mapping protocol by name. */
145 : uword *protocol_info_by_name;
146 : } snap_main_t;
147 :
148 : always_inline u32
149 14 : snap_header_get_oui (snap_header_t * h)
150 : {
151 14 : return (h->oui[0] << 16) | (h->oui[1] << 8) | h->oui[2];
152 : }
153 :
154 : always_inline snap_protocol_info_t *
155 8 : snap_get_protocol_info (snap_main_t * sm, snap_header_t * h)
156 : {
157 : snap_oui_and_protocol_t key;
158 : uword *p;
159 :
160 8 : key.oui = snap_header_get_oui (h);
161 8 : key.protocol = h->protocol;
162 :
163 8 : p = mhash_get (&sm->protocol_hash, &key);
164 8 : return p ? vec_elt_at_index (sm->protocols, p[0]) : 0;
165 : }
166 :
167 : extern snap_main_t snap_main;
168 :
169 : /* Register given node index to take input for given snap type. */
170 : void
171 : snap_register_input_protocol (vlib_main_t * vm,
172 : char *name,
173 : u32 ieee_oui, u16 protocol, u32 node_index);
174 :
175 : format_function_t format_snap_protocol;
176 : format_function_t format_snap_header;
177 : format_function_t format_snap_header_with_length;
178 :
179 : /* Parse snap protocol as 0xXXXX or protocol name. */
180 : unformat_function_t unformat_snap_protocol;
181 :
182 : /* Parse snap header. */
183 : unformat_function_t unformat_snap_header;
184 : unformat_function_t unformat_pg_snap_header;
185 :
186 : #endif /* included_snap_h */
187 :
188 : /*
189 : * fd.io coding-style-patch-verification: ON
190 : *
191 : * Local Variables:
192 : * eval: (c-set-style "gnu")
193 : * End:
194 : */
|