a35adf17c852e06103212a874f26e262cd765c83
[vpp.git] / src / vnet / ethernet / arp_packet.h
1 /*
2  * ethernet/arp.c: IP v4 ARP node
3  *
4  * Copyright (c) 2010 Cisco and/or its affiliates.
5  * Licensed under the Apache License, Version 2.0 (the "License");
6  * you may not use this file except in compliance with the License.
7  * You may obtain a copy of the License at:
8  *
9  *     http://www.apache.org/licenses/LICENSE-2.0
10  *
11  * Unless required by applicable law or agreed to in writing, software
12  * distributed under the License is distributed on an "AS IS" BASIS,
13  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14  * See the License for the specific language governing permissions and
15  * limitations under the License.
16  */
17
18 #ifndef included_ethernet_arp_packet_h
19 #define included_ethernet_arp_packet_h
20
21 #include <vnet/ip/ip4_packet.h>
22 #include <vnet/ethernet/mac_address.h>
23
24 #define foreach_ethernet_arp_hardware_type      \
25   _ (0, reserved)                               \
26   _ (1, ethernet)                               \
27   _ (2, experimental_ethernet)                  \
28   _ (3, ax_25)                                  \
29   _ (4, proteon_pronet_token_ring)              \
30   _ (5, chaos)                                  \
31   _ (6, ieee_802)                               \
32   _ (7, arcnet)                                 \
33   _ (8, hyperchannel)                           \
34   _ (9, lanstar)                                \
35   _ (10, autonet)                               \
36   _ (11, localtalk)                             \
37   _ (12, localnet)                              \
38   _ (13, ultra_link)                            \
39   _ (14, smds)                                  \
40   _ (15, frame_relay)                           \
41   _ (16, atm)                                   \
42   _ (17, hdlc)                                  \
43   _ (18, fibre_channel)                         \
44   _ (19, atm19)                                 \
45   _ (20, serial_line)                           \
46   _ (21, atm21)                                 \
47   _ (22, mil_std_188_220)                       \
48   _ (23, metricom)                              \
49   _ (24, ieee_1394)                             \
50   _ (25, mapos)                                 \
51   _ (26, twinaxial)                             \
52   _ (27, eui_64)                                \
53   _ (28, hiparp)                                \
54   _ (29, iso_7816_3)                            \
55   _ (30, arpsec)                                \
56   _ (31, ipsec_tunnel)                          \
57   _ (32, infiniband)                            \
58   _ (33, cai)                                   \
59   _ (34, wiegand)                               \
60   _ (35, pure_ip)                               \
61   _ (36, hw_exp1)                               \
62   _ (256, hw_exp2)
63
64 #define foreach_ethernet_arp_opcode             \
65   _ (reserved)                                  \
66   _ (request)                                   \
67   _ (reply)                                     \
68   _ (reverse_request)                           \
69   _ (reverse_reply)                             \
70   _ (drarp_request)                             \
71   _ (drarp_reply)                               \
72   _ (drarp_error)                               \
73   _ (inarp_request)                             \
74   _ (inarp_reply)                               \
75   _ (arp_nak)                                   \
76   _ (mars_request)                              \
77   _ (mars_multi)                                \
78   _ (mars_mserv)                                \
79   _ (mars_join)                                 \
80   _ (mars_leave)                                \
81   _ (mars_nak)                                  \
82   _ (mars_unserv)                               \
83   _ (mars_sjoin)                                \
84   _ (mars_sleave)                               \
85   _ (mars_grouplist_request)                    \
86   _ (mars_grouplist_reply)                      \
87   _ (mars_redirect_map)                         \
88   _ (mapos_unarp)                               \
89   _ (exp1)                                      \
90   _ (exp2)
91
92 typedef enum
93 {
94 #define _(n,f) ETHERNET_ARP_HARDWARE_TYPE_##f = (n),
95   foreach_ethernet_arp_hardware_type
96 #undef _
97 } ethernet_arp_hardware_type_t;
98
99 typedef enum
100 {
101 #define _(f) ETHERNET_ARP_OPCODE_##f,
102   foreach_ethernet_arp_opcode
103 #undef _
104     ETHERNET_ARP_N_OPCODE,
105 } ethernet_arp_opcode_t;
106
107 typedef enum
108 {
109   IP4_ARP_NEXT_DROP,
110   IP4_ARP_N_NEXT,
111 } ip4_arp_next_t;
112
113 typedef enum
114 {
115   IP4_ARP_ERROR_THROTTLED,
116   IP4_ARP_ERROR_RESOLVED,
117   IP4_ARP_ERROR_NO_BUFFERS,
118   IP4_ARP_ERROR_REQUEST_SENT,
119   IP4_ARP_ERROR_NON_ARP_ADJ,
120   IP4_ARP_ERROR_NO_SOURCE_ADDRESS,
121 } ip4_arp_error_t;
122
123 /* *INDENT-OFF* */
124 typedef CLIB_PACKED (struct {
125   mac_address_t mac;
126   ip4_address_t ip4;
127 }) ethernet_arp_ip4_over_ethernet_address_t;
128 /* *INDENT-ON* */
129
130 STATIC_ASSERT (sizeof (ethernet_arp_ip4_over_ethernet_address_t) == 10,
131                "Packet ethernet address and IP4 address too big");
132
133 typedef struct
134 {
135   u16 l2_type;
136   u16 l3_type;
137   u8 n_l2_address_bytes;
138   u8 n_l3_address_bytes;
139   u16 opcode;
140   union
141   {
142     ethernet_arp_ip4_over_ethernet_address_t ip4_over_ethernet[2];
143
144     /* Others... */
145     u8 data[0];
146   };
147 } ethernet_arp_header_t;
148
149 extern u8 *format_ethernet_arp_header (u8 * s, va_list * va);
150 extern u8 *format_ethernet_arp_opcode (u8 * s, va_list * va);
151 extern u8 *format_ethernet_arp_hardware_type (u8 * s, va_list * va);
152
153 #endif /* included_ethernet_arp_packet_h */
154
155 /*
156  * fd.io coding-style-patch-verification: ON
157  *
158  * Local Variables:
159  * eval: (c-set-style "gnu")
160  * End:
161  */