Import Upstream version 1.2.2
[quagga-debian.git] / nhrpd / nhrp_protocol.h
1 /* nhrp_protocol.h - NHRP protocol definitions
2  *
3  * Copyright (c) 2007-2012 Timo Teräs <timo.teras@iki.fi>
4  *
5  * This software is licensed under the MIT License.
6  * See MIT-LICENSE.txt for additional details.
7  */
8
9 #ifndef NHRP_PROTOCOL_H
10 #define NHRP_PROTOCOL_H
11
12 #include <stdint.h>
13
14 /* NHRP Ethernet protocol number */
15 #define ETH_P_NHRP                              0x2001
16
17 /* NHRP Version */
18 #define NHRP_VERSION_RFC2332                    1
19
20 /* NHRP Packet Types */
21 #define NHRP_PACKET_RESOLUTION_REQUEST          1
22 #define NHRP_PACKET_RESOLUTION_REPLY            2
23 #define NHRP_PACKET_REGISTRATION_REQUEST        3
24 #define NHRP_PACKET_REGISTRATION_REPLY          4
25 #define NHRP_PACKET_PURGE_REQUEST               5
26 #define NHRP_PACKET_PURGE_REPLY                 6
27 #define NHRP_PACKET_ERROR_INDICATION            7
28 #define NHRP_PACKET_TRAFFIC_INDICATION          8
29
30 /* NHRP Extension Types */
31 #define NHRP_EXTENSION_FLAG_COMPULSORY          0x8000
32 #define NHRP_EXTENSION_END                      0
33 #define NHRP_EXTENSION_PAYLOAD                  0
34 #define NHRP_EXTENSION_RESPONDER_ADDRESS        3
35 #define NHRP_EXTENSION_FORWARD_TRANSIT_NHS      4
36 #define NHRP_EXTENSION_REVERSE_TRANSIT_NHS      5
37 #define NHRP_EXTENSION_AUTHENTICATION           7
38 #define NHRP_EXTENSION_VENDOR                   8
39 #define NHRP_EXTENSION_NAT_ADDRESS              9
40
41 /* NHRP Error Indication Codes */
42 #define NHRP_ERROR_UNRECOGNIZED_EXTENSION       1
43 #define NHRP_ERROR_LOOP_DETECTED                2
44 #define NHRP_ERROR_PROTOCOL_ADDRESS_UNREACHABLE 6
45 #define NHRP_ERROR_PROTOCOL_ERROR               7
46 #define NHRP_ERROR_SDU_SIZE_EXCEEDED            8
47 #define NHRP_ERROR_INVALID_EXTENSION            9
48 #define NHRP_ERROR_INVALID_RESOLUTION_REPLY     10
49 #define NHRP_ERROR_AUTHENTICATION_FAILURE       11
50 #define NHRP_ERROR_HOP_COUNT_EXCEEDED           15
51
52 /* NHRP CIE Codes */
53 #define NHRP_CODE_SUCCESS                       0
54 #define NHRP_CODE_ADMINISTRATIVELY_PROHIBITED   4
55 #define NHRP_CODE_INSUFFICIENT_RESOURCES        5
56 #define NHRP_CODE_NO_BINDING_EXISTS             11
57 #define NHRP_CODE_BINDING_NON_UNIQUE            13
58 #define NHRP_CODE_UNIQUE_ADDRESS_REGISTERED     14
59
60 /* NHRP Flags for Resolution request/reply */
61 #define NHRP_FLAG_RESOLUTION_SOURCE_IS_ROUTER   0x8000
62 #define NHRP_FLAG_RESOLUTION_AUTHORATIVE        0x4000
63 #define NHRP_FLAG_RESOLUTION_DESTINATION_STABLE 0x2000
64 #define NHRP_FLAG_RESOLUTION_UNIQUE             0x1000
65 #define NHRP_FLAG_RESOLUTION_SOURCE_STABLE      0x0800
66 #define NHRP_FLAG_RESOLUTION_NAT                0x0002
67
68 /* NHRP Flags for Registration request/reply */
69 #define NHRP_FLAG_REGISTRATION_UNIQUE           0x8000
70 #define NHRP_FLAG_REGISTRATION_NAT              0x0002
71
72 /* NHRP Flags for Purge request/reply */
73 #define NHRP_FLAG_PURGE_NO_REPLY                0x8000
74
75 /* NHRP Authentication extension types (ala Cisco) */
76 #define NHRP_AUTHENTICATION_PLAINTEXT           0x00000001
77
78 /* NHRP Packet Structures */
79 struct nhrp_packet_header {
80         /* Fixed header */
81         uint16_t        afnum;
82         uint16_t        protocol_type;
83         uint8_t         snap[5];
84         uint8_t         hop_count;
85         uint16_t        packet_size;
86         uint16_t        checksum;
87         uint16_t        extension_offset;
88         uint8_t         version;
89         uint8_t         type;
90         uint8_t         src_nbma_address_len;
91         uint8_t         src_nbma_subaddress_len;
92
93         /* Mandatory header */
94         uint8_t         src_protocol_address_len;
95         uint8_t         dst_protocol_address_len;
96         uint16_t        flags;
97         union {
98                 uint32_t                request_id;
99                 struct {
100                         uint16_t        code;
101                         uint16_t        offset;
102                 } error;
103         } u;
104 } __attribute__((packed));
105
106 struct nhrp_cie_header {
107         uint8_t         code;
108         uint8_t         prefix_length;
109         uint16_t        unused;
110         uint16_t        mtu;
111         uint16_t        holding_time;
112         uint8_t         nbma_address_len;
113         uint8_t         nbma_subaddress_len;
114         uint8_t         protocol_address_len;
115         uint8_t         preference;
116 } __attribute__((packed));
117
118 struct nhrp_extension_header {
119         uint16_t        type;
120         uint16_t        length;
121 } __attribute__((packed));
122
123 struct nhrp_cisco_authentication_extension {
124         uint32_t        type;
125         uint8_t         secret[8];
126 } __attribute__((packed));
127
128 #endif