5 #ifndef vnsw_agent_dhcpv6_handler_hpp
6 #define vnsw_agent_dhcpv6_handler_hpp
10 #define ALL_DHCPV6_SERVERS_ADDRESS "FF05::1:3"
11 #define ALL_DHCPV6_RELAYAGENTS_SERVERS_ADDRESS "FF05::1:3"
14 #define DHCPV6_OPTION_UNKNOWN 0
15 #define DHCPV6_OPTION_CLIENTID 1
16 #define DHCPV6_OPTION_SERVERID 2
17 #define DHCPV6_OPTION_IA_NA 3
18 #define DHCPV6_OPTION_IA_TA 4
19 #define DHCPV6_OPTION_IAADDR 5
20 #define DHCPV6_OPTION_ORO 6
21 #define DHCPV6_OPTION_PREFERENCE 7
22 #define DHCPV6_OPTION_ELAPSED_TIME 8
23 #define DHCPV6_OPTION_RELAY_MSG 9
25 #define DHCPV6_OPTION_AUTH 11
26 #define DHCPV6_OPTION_UNICAST 12
27 #define DHCPV6_OPTION_STATUS_CODE 13
28 #define DHCPV6_OPTION_RAPID_COMMIT 14
29 #define DHCPV6_OPTION_USER_CLASS 15
30 #define DHCPV6_OPTION_VENDOR_CLASS 16
31 #define DHCPV6_OPTION_VENDOR_OPTS 17
32 #define DHCPV6_OPTION_INTERFACE_ID 18
33 #define DHCPV6_OPTION_RECONF_MSG 19
34 #define DHCPV6_OPTION_RECONF_ACCEPT 20
35 #define DHCPV6_OPTION_SIP_SERVER_D 21
36 #define DHCPV6_OPTION_SIP_SERVER_A 22
37 #define DHCPV6_OPTION_DNS_SERVERS 23
38 #define DHCPV6_OPTION_DOMAIN_LIST 24
39 #define DHCPV6_OPTION_IA_PD 25
40 #define DHCPV6_OPTION_IAPREFIX 26
41 #define DHCPV6_OPTION_NIS_SERVERS 27
42 #define DHCPV6_OPTION_NISP_SERVERS 28
43 #define DHCPV6_OPTION_NIS_DOMAIN_NAME 29
44 #define DHCPV6_OPTION_NISP_DOMAIN_NAME 30
45 #define DHCPV6_OPTION_SNTP_SERVERS 31
46 #define DHCPV6_OPTION_INFORMATION_REFRESH_TIME 32
47 #define DHCPV6_OPTION_BCMCS_SERVER_D 33
48 #define DHCPV6_OPTION_BCMCS_SERVER_A 34
50 #define DHCPV6_OPTION_GEOCONF_CIVIC 36
51 #define DHCPV6_OPTION_REMOTE_ID 37
52 #define DHCPV6_OPTION_SUBSCRIBER_ID 38
53 #define DHCPV6_OPTION_CLIENT_FQDN 39
54 #define DHCPV6_OPTION_PANA_AGENT 40
55 #define DHCPV6_OPTION_NEW_POSIX_TIMEZONE 41
56 #define DHCPV6_OPTION_NEW_TZDB_TIMEZONE 42
57 #define DHCPV6_OPTION_ERO 43
58 #define DHCPV6_OPTION_LQ_QUERY 44
59 #define DHCPV6_OPTION_CLIENT_DATA 45
60 #define DHCPV6_OPTION_CLT_TIME 46
61 #define DHCPV6_OPTION_LQ_RELAY_DATA 47
62 #define DHCPV6_OPTION_LQ_CLIENT_LINK 48
63 #define DHCPV6_OPTION_MIP6_HNIDF 49
64 #define DHCPV6_OPTION_MIP6_VDINF 50
65 #define DHCPV6_OPTION_V6_LOST 51
66 #define DHCPV6_OPTION_CAPWAP_AC_V6 52
67 #define DHCPV6_OPTION_RELAY_ID 53
68 #define DHCPV6_OPTION_IPv6_Address_MoS 54
69 #define DHCPV6_OPTION_IPv6_FQDN_MoS 55
70 #define DHCPV6_OPTION_NTP_SERVER 56
71 #define DHCPV6_OPTION_V6_ACCESS_DOMAIN 57
72 #define DHCPV6_OPTION_SIP_UA_CS_LIST 58
73 #define DHCPV6_OPT_BOOTFILE_URL 59
74 #define DHCPV6_OPT_BOOTFILE_PARAM 60
75 #define DHCPV6_OPTION_CLIENT_ARCH_TYPE 61
76 #define DHCPV6_OPTION_NII 62
77 #define DHCPV6_OPTION_GEOLOCATION 63
78 #define DHCPV6_OPTION_AFTR_NAME 64
79 #define DHCPV6_OPTION_ERP_LOCAL_DOMAIN_NAME 65
80 #define DHCPV6_OPTION_RSOO 66
81 #define DHCPV6_OPTION_PD_EXCLUDE 67
82 #define DHCPV6_OPTION_VSS 68
83 #define DHCPV6_OPTION_MIP6_IDINF 69
84 #define DHCPV6_OPTION_MIP6_UDINF 70
85 #define DHCPV6_OPTION_MIP6_HNP 71
86 #define DHCPV6_OPTION_MIP6_HAA 72
87 #define DHCPV6_OPTION_MIP6_HAF 73
88 #define DHCPV6_OPTION_RDNSS_SELECTION 74
89 #define DHCPV6_OPTION_KRB_PRINCIPAL_NAME 75
90 #define DHCPV6_OPTION_KRB_REALM_NAME 76
91 #define DHCPV6_OPTION_KRB_DEFAULT_REALM_NAME 77
92 #define DHCPV6_OPTION_KRB_KDC 78
93 #define DHCPV6_OPTION_CLIENT_LINKLAYER_ADDR 79
94 #define DHCPV6_OPTION_LINK_ADDRESS 80
95 #define DHCPV6_OPTION_RADIUS 81
96 #define DHCPV6_OPTION_SOL_MAX_RT 82
97 #define DHCPV6_OPTION_INF_MAX_RT 83
98 #define DHCPV6_OPTION_ADDRSEL 84
99 #define DHCPV6_OPTION_ADDRSEL_TABLE 85
100 #define DHCPV6_OPTION_V6_PCP_SERVER 86
101 #define DHCPV6_OPTION_DHCPV4_MSG 87
102 #define DHCPV6_OPTION_DHCP4_O_DHCP6_SERVER 88
103 #define DHCPV6_OPTION_S46_RULE 89
104 #define DHCPV6_OPTION_S46_BR 90
105 #define DHCPV6_OPTION_S46_DMR 91
106 #define DHCPV6_OPTION_S46_V4V6BIND 92
107 #define DHCPV6_OPTION_S46_PORTPARAMS 93
108 #define DHCPV6_OPTION_S46_CONT_MAPE 94
109 #define DHCPV6_OPTION_S46_CONT_MAPT 95
110 #define DHCPV6_OPTION_S46_CONT_LW 96
112 #define DHCPV6_OPTION_IPv6_ADDRESS_ANDSF 143
115 #define DHCPV6_UNKNOWN 0
116 #define DHCPV6_SOLICIT 1
117 #define DHCPV6_ADVERTISE 2
118 #define DHCPV6_REQUEST 3
119 #define DHCPV6_CONFIRM 4
120 #define DHCPV6_RENEW 5
121 #define DHCPV6_REBIND 6
122 #define DHCPV6_REPLY 7
123 #define DHCPV6_RELEASE 8
124 #define DHCPV6_DECLINE 9
125 #define DHCPV6_RECONFIGURE 10
126 #define DHCPV6_INFORMATION_REQUEST 11
129 #define DHCPV6_SUCCESS 0
130 #define DHCPV6_UNSPEC_FAIL 1
131 #define DHCPV6_NO_ADDRS_AVAIL 2
132 #define DHCPV6_NO_BINDING 3
133 #define DHCPV6_NOT_ON_LINK 4
134 #define DHCPV6_USE_MULTICAST 5
136 #define DHCPV6_SHORTLEASE_TIME 4
137 #define DHCP_PKT_SIZE 1024
138 #define MAX_DOMAIN_NAME_LENGTH 256
141 #define DHCPV6_FIXED_LEN 4
144 void WriteData(uint16_t c, uint16_t l,
const void *d, uint16_t *optlen) {
147 memcpy(
data, (uint8_t *)d, l);
150 void AppendData(uint16_t l,
const void *d, uint16_t *optlen) {
151 uint16_t curr_len = ntohs(
len);
152 memcpy(
data + curr_len, (uint8_t *)d, l);
153 len = htons(curr_len + l);
157 len = htons(ntohs(
len) + l);
161 uint8_t *next =
reinterpret_cast<uint8_t *
>(
this);
216 typedef boost::scoped_array<uint8_t>
Duid;
226 for (std::vector<Dhcpv6IaAddr>::iterator it =
ia_addr.begin();
228 if (memcmp(it->address, addr.
address, 16) == 0) {
244 void WriteData(uint8_t c, uint8_t l,
const void *d, uint16_t *optlen) {
247 void AppendData(uint16_t l,
const void *d, uint16_t *optlen) {
267 boost::asio::io_context &io);
274 bool ReadIA(uint8_t *ptr, uint16_t len, uint16_t code);
278 uint16_t
AddIP(uint16_t opt_len,
const std::string &input);
289 uint32_t
OptionCode(
const std::string &option)
const;
290 void DhcpTrace(
const std::string &msg)
const;
320 #endif // vnsw_agent_dhcpv6_handler_hpp
std::map< std::string, uint32_t >::const_iterator Dhcpv6NameCodeIter
void AddIa(Dhcpv6Ia *ia_ptr)
void AppendData(uint16_t l, const void *d, uint16_t *optlen)
void IncrementByteInAddress(Ip6Address::bytes_type &bytes, uint8_t index)
uint32_t OptionCode(const std::string &option) const
bool ReadIA(uint8_t *ptr, uint16_t len, uint16_t code)
void WriteData(uint16_t c, uint16_t l, const void *d, uint16_t *optlen)
Ip6Address GetNextV6Address(uint8_t addr[])
boost::scoped_array< uint8_t > Duid
uint16_t server_duid_len_
boost::scoped_ptr< Dhcpv6IaData > ia_na_
uint16_t AddIP(uint16_t opt_len, const std::string &input)
std::map< std::string, uint32_t > Dhcpv6NameCodeMap
Dhcpv6OptionHandler(uint8_t *ptr)
uint16_t FillDhcpResponse(const MacAddress &dest_mac, Ip6Address src_ip, Ip6Address dest_ip)
uint32_t preferred_lifetime
boost::asio::ip::address_v6 Ip6Address
void SetNextOptionPtr(uint16_t optlen)
void SetDhcpOptionPtr(uint8_t *ptr)
uint16_t client_duid_len_
std::map< uint32_t, Dhcpv6Handler::DhcpOptionCategory > Dhcpv6CategoryMap
uint16_t AddDomainNameOption(uint16_t opt_len)
void WriteIaOption(uint16_t &optlen)
uint8_t * dhcp_option_ptr
static const uint16_t kDhcpOptionFixedLen
DhcpOptionCategory OptionCategory(uint32_t option) const
std::vector< Dhcpv6IaAddr > ia_addr
void WriteData(uint8_t c, uint8_t l, const void *d, uint16_t *optlen)
void AppendData(uint16_t l, const void *d, uint16_t *optlen)
void AddIaAddr(Dhcpv6IaAddr *ia_addr_ptr)
Dhcpv6IaAddr(uint8_t *addr, uint32_t pl, uint32_t vl)
std::map< uint32_t, Dhcpv6Handler::DhcpOptionCategory >::const_iterator Dhcpv6CategoryIter
Dhcpv6Options * GetNextOptionPtr()
bool DelIaAddr(const Dhcpv6IaAddr &addr)
uint16_t GetFixedLen() const
Dhcpv6IaAddr(Dhcpv6IaAddr *ptr)
Dhcpv6Handler(Agent *agent, boost::shared_ptr< PktInfo > info, boost::asio::io_context &io)
Dhcpv6Options * GetNextOptionPtr(uint16_t optlen)
void Assign(Dhcpv6Ia *ptr)
void DhcpTrace(const std::string &msg) const
DISALLOW_COPY_AND_ASSIGN(Dhcpv6Handler)
void FillDhcpInfo(Ip6Address &addr, int plen, Ip6Address &gw, Ip6Address &dns)
void ReadOptions(int16_t opt_rem_len)