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 : * ethernet/packet.h: ethernet packet format.
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_ethernet_packet_h
41 : #define included_ethernet_packet_h
42 :
43 : #include <vnet/interface.h>
44 :
45 : typedef enum
46 : {
47 : #define ethernet_type(n,s) ETHERNET_TYPE_##s = n,
48 : #include <vnet/ethernet/types.def>
49 : #undef ethernet_type
50 : } ethernet_type_t;
51 :
52 : typedef struct
53 : {
54 : /* Source/destination address. */
55 : u8 dst_address[6];
56 : u8 src_address[6];
57 :
58 : /* Ethernet type. */
59 : u16 type;
60 : } ethernet_header_t;
61 :
62 : #define ETHERNET_ADDRESS_UNICAST 0
63 : #define ETHERNET_ADDRESS_MULTICAST 1
64 :
65 : /* I/G bit: individual (unicast)/group (broadcast/multicast). */
66 : always_inline uword
67 52484761 : ethernet_address_cast (const u8 * a)
68 : {
69 52484761 : return (a[0] >> 0) & 1;
70 : }
71 :
72 : always_inline int
73 0 : ethernet_address_is_broadcast (const u8 * a)
74 : {
75 0 : return clib_mem_unaligned (a, u32) == 0xffffffff &&
76 0 : clib_mem_unaligned (a + 4, u16) == 0xffff;
77 : }
78 :
79 : always_inline uword
80 : ethernet_address_is_locally_administered (const u8 * a)
81 : {
82 : return (a[0] >> 1) & 1;
83 : }
84 :
85 : always_inline void
86 : ethernet_address_set_locally_administered (u8 * a)
87 : {
88 : a[0] |= 1 << 1;
89 : }
90 :
91 : always_inline int
92 0 : eh_dst_addr_to_rx_ctype (const ethernet_header_t * eh)
93 : {
94 0 : if (PREDICT_TRUE (ethernet_address_cast (eh->dst_address) ==
95 : ETHERNET_ADDRESS_UNICAST))
96 : {
97 0 : return VNET_INTERFACE_COUNTER_RX_UNICAST;
98 : }
99 0 : else if (ethernet_address_is_broadcast (eh->dst_address))
100 : {
101 0 : return VNET_INTERFACE_COUNTER_RX_BROADCAST;
102 : }
103 : else
104 : {
105 0 : return VNET_INTERFACE_COUNTER_RX_MULTICAST;
106 : }
107 : }
108 :
109 : always_inline int
110 0 : eh_dst_addr_to_tx_ctype (const ethernet_header_t * eh)
111 : {
112 0 : if (PREDICT_TRUE (ethernet_address_cast (eh->dst_address) ==
113 : ETHERNET_ADDRESS_UNICAST))
114 : {
115 0 : return VNET_INTERFACE_COUNTER_TX_UNICAST;
116 : }
117 0 : else if (ethernet_address_is_broadcast (eh->dst_address))
118 : {
119 0 : return VNET_INTERFACE_COUNTER_TX_BROADCAST;
120 : }
121 : else
122 : {
123 0 : return VNET_INTERFACE_COUNTER_TX_MULTICAST;
124 : }
125 : }
126 :
127 : /* For VLAN ethernet type. */
128 : typedef struct
129 : {
130 : /* 3 bit priority, 1 bit CFI and 12 bit vlan id. */
131 : u16 priority_cfi_and_id;
132 :
133 : #define ETHERNET_N_VLAN (1 << 12)
134 :
135 : /* Inner ethernet type. */
136 : u16 type;
137 : } ethernet_vlan_header_t;
138 :
139 : always_inline void
140 135 : ethernet_vlan_header_set_priority_net_order (ethernet_vlan_header_t * h,
141 : u8 prio)
142 : {
143 135 : u8 *bytes = (u8 *) (&h->priority_cfi_and_id);
144 :
145 135 : bytes[0] &= 0x0f;
146 135 : bytes[0] |= (prio & 0xf) << 4;
147 135 : }
148 :
149 : always_inline u8
150 201 : ethernet_vlan_header_get_priority_net_order (ethernet_vlan_header_t * h)
151 : {
152 201 : u8 *bytes = (u8 *) (&h->priority_cfi_and_id);
153 :
154 201 : return (bytes[0] >> 4);
155 : }
156 :
157 : /* VLAN with ethertype first and vlan id second */
158 : typedef struct
159 : {
160 : /* vlan type */
161 : u16 type;
162 :
163 : /* 3 bit priority, 1 bit CFI and 12 bit vlan id. */
164 : u16 priority_cfi_and_id;
165 : } ethernet_vlan_header_tv_t;
166 :
167 : /* PBB header with B-TAG - backbone VLAN indicator and I-TAG - service encapsulation */
168 : typedef struct
169 : {
170 : /* Backbone source/destination address. */
171 : u8 b_dst_address[6];
172 : u8 b_src_address[6];
173 :
174 : /* B-tag */
175 : u16 b_type;
176 : /* 3 bit priority, 1 bit DEI and 12 bit vlan id */
177 : u16 priority_dei_id;
178 :
179 : /* I-tag */
180 : u16 i_type;
181 : /* 3 bit priority, 1 bit DEI, 1 bit UCA, 3 bit RES and 24 bit I_SID (service identifier) */
182 : u32 priority_dei_uca_res_sid;
183 :
184 : #define ETHERNET_N_PBB (1 << 24)
185 : } ethernet_pbb_header_t;
186 :
187 : /* *INDENT-OFF* */
188 : typedef CLIB_PACKED (struct
189 : {
190 : /* Backbone source/destination address. */
191 : u8 b_dst_address[6];
192 : u8 b_src_address[6];
193 :
194 : /* B-tag */
195 : u16 b_type;
196 : /* 3 bit priority, 1 bit DEI and 12 bit vlan id */
197 : u16 priority_dei_id;
198 :
199 : /* I-tag */
200 : u16 i_type;
201 : /* 3 bit priority, 1 bit DEI, 1 bit UCA, 3 bit RES and 24 bit I_SID (service identifier) */
202 : u32 priority_dei_uca_res_sid;
203 : }) ethernet_pbb_header_packed_t;
204 : /* *INDENT-ON* */
205 :
206 : #endif /* included_ethernet_packet_h */
207 :
208 : /*
209 : * fd.io coding-style-patch-verification: ON
210 : *
211 : * Local Variables:
212 : * eval: (c-set-style "gnu")
213 : * End:
214 : */
|