Initial commit of vpp code.
[vpp.git] / vnet / 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 #define foreach_ethernet_arp_hardware_type      \
22   _ (0, reserved)                               \
23   _ (1, ethernet)                               \
24   _ (2, experimental_ethernet)                  \
25   _ (3, ax_25)                                  \
26   _ (4, proteon_pronet_token_ring)              \
27   _ (5, chaos)                                  \
28   _ (6, ieee_802)                               \
29   _ (7, arcnet)                                 \
30   _ (8, hyperchannel)                           \
31   _ (9, lanstar)                                \
32   _ (10, autonet)                               \
33   _ (11, localtalk)                             \
34   _ (12, localnet)                              \
35   _ (13, ultra_link)                            \
36   _ (14, smds)                                  \
37   _ (15, frame_relay)                           \
38   _ (16, atm)                                   \
39   _ (17, hdlc)                                  \
40   _ (18, fibre_channel)                         \
41   _ (19, atm19)                                 \
42   _ (20, serial_line)                           \
43   _ (21, atm21)                                 \
44   _ (22, mil_std_188_220)                       \
45   _ (23, metricom)                              \
46   _ (24, ieee_1394)                             \
47   _ (25, mapos)                                 \
48   _ (26, twinaxial)                             \
49   _ (27, eui_64)                                \
50   _ (28, hiparp)                                \
51   _ (29, iso_7816_3)                            \
52   _ (30, arpsec)                                \
53   _ (31, ipsec_tunnel)                          \
54   _ (32, infiniband)                            \
55   _ (33, cai)                                   \
56   _ (34, wiegand)                               \
57   _ (35, pure_ip)                               \
58   _ (36, hw_exp1)                               \
59   _ (256, hw_exp2)
60
61 #define foreach_ethernet_arp_opcode             \
62   _ (reserved)                                  \
63   _ (request)                                   \
64   _ (reply)                                     \
65   _ (reverse_request)                           \
66   _ (reverse_reply)                             \
67   _ (drarp_request)                             \
68   _ (drarp_reply)                               \
69   _ (drarp_error)                               \
70   _ (inarp_request)                             \
71   _ (inarp_reply)                               \
72   _ (arp_nak)                                   \
73   _ (mars_request)                              \
74   _ (mars_multi)                                \
75   _ (mars_mserv)                                \
76   _ (mars_join)                                 \
77   _ (mars_leave)                                \
78   _ (mars_nak)                                  \
79   _ (mars_unserv)                               \
80   _ (mars_sjoin)                                \
81   _ (mars_sleave)                               \
82   _ (mars_grouplist_request)                    \
83   _ (mars_grouplist_reply)                      \
84   _ (mars_redirect_map)                         \
85   _ (mapos_unarp)                               \
86   _ (exp1)                                      \
87   _ (exp2)
88
89 typedef enum {
90 #define _(n,f) ETHERNET_ARP_HARDWARE_TYPE_##f = (n),
91   foreach_ethernet_arp_hardware_type
92 #undef _
93 } ethernet_arp_hardware_type_t;
94
95 typedef enum {
96 #define _(f) ETHERNET_ARP_OPCODE_##f,
97   foreach_ethernet_arp_opcode
98 #undef _
99   ETHERNET_ARP_N_OPCODE,
100 } ethernet_arp_opcode_t;
101
102 typedef enum {
103   IP4_ARP_NEXT_DROP,
104   IP4_ARP_N_NEXT,
105 } ip4_arp_next_t;
106
107 typedef enum {
108   IP4_ARP_ERROR_DROP,
109   IP4_ARP_ERROR_REQUEST_SENT,
110   IP4_ARP_ERROR_NON_ARP_ADJ,
111   IP4_ARP_ERROR_REPLICATE_DROP,
112   IP4_ARP_ERROR_REPLICATE_FAIL
113 } ip4_arp_error_t;
114
115 typedef CLIB_PACKED (struct {
116   u8 ethernet[6];
117   ip4_address_t ip4;
118 }) ethernet_arp_ip4_over_ethernet_address_t;
119
120 typedef struct {
121   u16 l2_type;
122   u16 l3_type;
123   u8 n_l2_address_bytes;
124   u8 n_l3_address_bytes;
125   u16 opcode;
126   union {
127     ethernet_arp_ip4_over_ethernet_address_t ip4_over_ethernet[2];
128
129     /* Others... */
130     u8 data[0];
131   };
132 } ethernet_arp_header_t;
133
134 #endif /* included_ethernet_arp_packet_h */