c406dade6e224b44c32b55706875f9f8f51ccb54
[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 /* *INDENT-OFF* */
114 typedef CLIB_PACKED (struct {
115   mac_address_t mac;
116   ip4_address_t ip4;
117 }) ethernet_arp_ip4_over_ethernet_address_t;
118 /* *INDENT-ON* */
119
120 STATIC_ASSERT (sizeof (ethernet_arp_ip4_over_ethernet_address_t) == 10,
121                "Packet ethernet address and IP4 address too big");
122
123 typedef struct
124 {
125   u16 l2_type;
126   u16 l3_type;
127   u8 n_l2_address_bytes;
128   u8 n_l3_address_bytes;
129   u16 opcode;
130   union
131   {
132     ethernet_arp_ip4_over_ethernet_address_t ip4_over_ethernet[2];
133
134     /* Others... */
135     u8 data[0];
136   };
137 } ethernet_arp_header_t;
138
139 #define ARP_SENDER 0
140 #define ARP_TARGET 1
141
142 extern u8 *format_ethernet_arp_header (u8 * s, va_list * va);
143 extern u8 *format_ethernet_arp_opcode (u8 * s, va_list * va);
144 extern u8 *format_ethernet_arp_hardware_type (u8 * s, va_list * va);
145
146 #endif /* included_ethernet_arp_packet_h */
147
148 /*
149  * fd.io coding-style-patch-verification: ON
150  *
151  * Local Variables:
152  * eval: (c-set-style "gnu")
153  * End:
154  */