13 #include "services/services_types.h"
20 #include <boost/assign/list_of.hpp>
21 #include <boost/scoped_array.hpp>
22 using namespace boost::assign;
30 map_list_of<std::string, uint32_t>
128 map_list_of<uint32_t, Dhcpv6Handler::DhcpOptionCategory>
227 boost::asio::io_context &io)
230 rapid_commit_(false), reconfig_accept_(false),
231 client_duid_len_(0), server_duid_len_(0),
232 client_duid_(NULL), server_duid_(NULL), is_ia_na_(true) {
246 if (options_len < 0) {
248 DHCPV6_TRACE(Error,
"Improper DHCPv6 packet length; vrf = " <<
260 DHCPV6_TRACE(Error,
"Received DHCP packet on invalid interface : "
267 DHCPV6_TRACE(Error,
"Received DHCP packet on non VM port interface : "
274 DHCPV6_TRACE(Error,
"DHCP request on VM port with dhcp services disabled: "
343 "DHCP information request received on interface : "
370 while (opt_rem_len > 0) {
371 uint16_t option_code = ntohs(opt->
code);
372 uint16_t option_len = ntohs(opt->
len);
373 if (option_len > opt_rem_len) {
377 switch (option_code) {
425 opt_rem_len -= (4 + option_len);
431 if (
ia_na_.get() == NULL) {
437 int16_t iana_rem_len = len -
sizeof(
Dhcpv6Ia);
439 while (iana_rem_len > 0) {
440 uint16_t iana_option_code = ntohs(iana_option->code);
441 uint16_t iana_option_len = ntohs(iana_option->len);
442 switch (iana_option_code) {
449 uint16_t *s_ptr =
reinterpret_cast<uint16_t *
>
451 uint16_t status = ntohs(*s_ptr);
453 std::string msg((
const char *)iana_option->data + 2,
454 iana_option_len - 2);
456 status <<
" error msg : " << msg <<
457 "; received on interface : " <<
466 iana_rem_len -= (4 + iana_option_len);
467 iana_option = (
Dhcpv6Options *)((uint8_t *)iana_option + 4 + iana_option_len);
488 DHCPV6_TRACE(Error,
"DHCP fabric port request failed for : "
494 for (uint32_t i = 0; i < ipam.size(); ++i) {
495 if (!ipam[i].IsV6()) {
501 if (ipam[i].default_gw.is_v6()) {
502 default_gw = ipam[i].default_gw.to_v6();
505 if (ipam[i].dns_server.is_unspecified()) {
506 service_address = default_gw;
508 if (ipam[i].dns_server.is_v6()) {
509 service_address = ipam[i].dns_server.to_v6();
512 FillDhcpInfo(ip, ipam[i].plen, default_gw, service_address);
525 <<
"; IPv6 not active in Agent");
531 boost::system::error_code ec;
532 Ip6Address ip = Ip6Address::from_string(input, ec);
534 option_->AppendData(16, ip.to_bytes().data(), &opt_len);
538 "; has to be IP address");
545 if (
ipam_type_.ipam_dns_method ==
"virtual-dns-server") {
548 boost::scoped_array<uint8_t> domain_name(
new uint8_t[
config_.
domain_name_.size() * 2 + 2]);
552 domain_name.get(), &opt_len);
564 uint16_t opt_len = 0;
567 option_->SetNextOptionPtr(opt_len);
573 option_->SetNextOptionPtr(opt_len);
579 option_->SetNextOptionPtr(opt_len);
588 uint16_t old_opt_len = opt_len;
589 option_->SetNextOptionPtr(opt_len);
593 if (opt_len == old_opt_len +
option_->GetFixedLen())
594 opt_len = old_opt_len;
598 option_->SetNextOptionPtr(opt_len);
610 if (bytes[index] != 0) {
618 Ip6Address::bytes_type bytes;
619 for (
int i = 0; i < 16; i++) {
627 if (
ia_na_.get() == NULL) {
631 uint32_t alloc_unit = 1;
636 if (alloc_unit > 128) {
637 DHCPV6_TRACE(Error,
"Alloc-unit(" << alloc_unit <<
") in Ipam is"
638 " higher than supported value(128), using max supported"
648 option_->WriteData(ia_option, ia_option_length, (
void *)&
ia_na_->ia, &optlen);
650 for (uint32_t i = 0; i < alloc_unit; i++) {
655 (
void *)&ia_addr, &optlen);
659 memcpy(ia_addr.address, next_ip.to_bytes().data(), 16);
665 for (std::vector<Dhcpv6IaAddr>::iterator it =
ia_na_->ia_addr.begin();
666 it !=
ia_na_->ia_addr.end(); ++it) {
667 memcpy(ia_addr.address, it->address, 16);
670 (
void *)&ia_addr, &optlen);
673 std::string message =
"Some of the addresses are not on link";
676 (
void *)&status_code, &optlen);
677 ia_addr_opt->
AppendData(message.length(), message.c_str(), &optlen);
678 option_->AddLen(message.length() + 6);
686 uint16_t eth_len = 0;
698 len +=
sizeof(udphdr);
702 dest_ip.to_bytes().data());
703 len +=
sizeof(ip6_hdr);
706 return pkt_info_->packet_buffer()->data_len();
#define DHCPV6_OPTION_S46_CONT_MAPE
#define DHCPV6_NOT_ON_LINK
#define DHCPV6_OPTION_SIP_SERVER_D
std::map< std::string, uint32_t >::const_iterator Dhcpv6NameCodeIter
#define DHCPV6_OPTION_MIP6_IDINF
#define DHCPV6_OPTION_USER_CLASS
#define DHCPV6_OPTION_PANA_AGENT
void IncrStatsAdvertise()
bool dhcp_enable_v6_config() const
#define DHCPV6_OPTION_BCMCS_SERVER_A
void FindDomainName(const IpAddress &vm_addr)
#define DHCPV6_OPTION_S46_CONT_MAPT
uint16_t AddConfigDhcpOptions(uint16_t opt_len, bool is_v6)
#define DHCPV6_OPTION_CLIENT_ARCH_TYPE
#define DHCPV6_OPTION_MIP6_UDINF
boost::scoped_ptr< DhcpOptionHandler > option_
#define DHCPV6_OPTION_IPv6_Address_MoS
#define DHCPV6_OPTION_SNTP_SERVERS
void IncrementByteInAddress(Ip6Address::bytes_type &bytes, uint8_t index)
#define DHCPV6_OPTION_RADIUS
uint32_t OptionCode(const std::string &option) const
bool ReadIA(uint8_t *ptr, uint16_t len, uint16_t code)
static std::string & Dhcpv6MsgType(uint32_t msg_type)
#define DHCPV6_OPTION_NEW_POSIX_TIMEZONE
void WriteData(uint16_t c, uint16_t l, const void *d, uint16_t *optlen)
#define DHCPV6_OPTION_KRB_DEFAULT_REALM_NAME
#define DHCPV6_OPTION_AUTH
#define DHCPV6_SERVER_PORT
#define DHCPV6_OPTION_IA_NA
#define DHCPV6_OPTION_BCMCS_SERVER_D
#define DHCPV6_OPTION_RSOO
const Interface * vhost_interface() const
#define DHCPV6_OPT_BOOTFILE_URL
Ip6Address GetNextV6Address(uint8_t addr[])
#define DHCPV6_OPTION_V6_PCP_SERVER
#define DHCPV6_OPTION_NIS_DOMAIN_NAME
#define DHCPV6_OPT_BOOTFILE_PARAM
#define DHCPV6_OPTION_IA_PD
#define DHCPV6_OPTION_STATUS_CODE
#define DHCPV6_OPTION_INTERFACE_ID
#define DHCPV6_OPTION_NISP_DOMAIN_NAME
InterfaceTable * interface_table() const
uint16_t server_duid_len_
#define DHCPV6_OPTION_V6_ACCESS_DOMAIN
#define DHCPV6_OPTION_RELAY_ID
#define DHCPV6_OPTION_GEOCONF_CIVIC
#define DHCPV6_OPTION_ELAPSED_TIME
boost::scoped_ptr< Dhcpv6IaData > ia_na_
Dhcpv6CategoryMap g_dhcpv6_category_map
#define DHCPV6_OPTION_MIP6_HNIDF
const MacAddress & mac() const
#define DHCPV6_OPTION_DNS_SERVERS
#define DHCPV6_OPTION_GEOLOCATION
#define DHCPV6_OPTION_DHCPV4_MSG
uint16_t AddIP(uint16_t opt_len, const std::string &input)
#define DHCPV6_OPTION_NEW_TZDB_TIMEZONE
#define DHCPV6_OPTION_NISP_SERVERS
#define DHCPV6_OPTION_PREFERENCE
#define DHCPV6_OPTION_RELAY_MSG
boost::shared_ptr< PktInfo > pkt_info_
#define DHCPV6_OPTION_S46_BR
#define DHCPV6_OPTION_S46_RULE
#define DHCPV6_OPTION_MIP6_HAF
const Duid * server_duid() const
#define DHCPV6_OPTION_S46_PORTPARAMS
#define DHCPV6_OPTION_INFORMATION_REFRESH_TIME
#define DHCPV6_OPTION_MIP6_HNP
#define DHCPV6_SHORTLEASE_TIME
#define DHCPV6_OPTION_SERVERID
Dhcpv6Proto * dhcpv6_proto() const
uint16_t AddDnsServers(uint16_t opt_len)
int EthHdr(const MacAddress &src, const MacAddress &dest, const uint16_t proto)
#define DHCPV6_OPTION_KRB_KDC
#define DHCPV6_OPTION_VENDOR_CLASS
#define DHCPV6_OPTION_KRB_REALM_NAME
std::map< std::string, uint32_t > Dhcpv6NameCodeMap
uint32_t GetInterfaceIndex() const
uint16_t FillDhcpResponse(const MacAddress &dest_mac, Ip6Address src_ip, Ip6Address dest_ip)
#define DHCPV6_OPTION_SUBSCRIBER_ID
#define DHCPV6_OPTION_CLIENTID
#define DHCPV6_OPTION_RECONF_MSG
#define DHCPV6_OPTION_LQ_QUERY
uint32_t GetAllocUnitFromIpam(const IpAddress &ip) const
#define DHCPV6_OPTION_DHCP4_O_DHCP6_SERVER
#define DHCPV6_OPTION_SIP_UA_CS_LIST
boost::asio::ip::address_v6 Ip6Address
static uint8_t * AddName(uint8_t *ptr, const std::string &addr, uint16_t plen, uint16_t offset, uint16_t &length)
#define DHCPV6_OPTION_RAPID_COMMIT
#define DHCPV6_OPTION_ADDRSEL_TABLE
void Send(uint32_t itf, uint32_t vrf, uint16_t, PktHandler::PktModuleName)
#define DHCPV6_OPTION_ADDRSEL
#define DHCPV6_OPTION_LINK_ADDRESS
uint16_t client_duid_len_
const std::vector< VnIpam > & GetVnIpam() const
const VnEntry * vn() const
std::map< uint32_t, Dhcpv6Handler::DhcpOptionCategory > Dhcpv6CategoryMap
#define DHCPV6_OPTION_S46_V4V6BIND
uint16_t AddDomainNameOption(uint16_t opt_len)
void WriteIaOption(uint16_t &optlen)
#define DHCPV6_OPTION_AFTR_NAME
void Ip6Hdr(ip6_hdr *ip, uint16_t plen, uint8_t next_header, uint8_t hlim, uint8_t *src, uint8_t *dest)
#define DHCPV6_OPTION_RECONF_ACCEPT
#define DHCPV6_OPTION_VSS
#define DHCPV6_OPTION_CLIENT_FQDN
#define DHCPV6_OPTION_V6_LOST
#define DHCPV6_OPTION_VENDOR_OPTS
#define DHCPV6_OPTION_LQ_CLIENT_LINK
#define DHCPV6_TRACE(obj, arg)
DhcpOptionCategory OptionCategory(uint32_t option) const
#define DHCPV6_OPTION_SIP_SERVER_A
#define DHCPV6_OPTION_CLIENT_LINKLAYER_ADDR
void AppendData(uint16_t l, const void *d, uint16_t *optlen)
#define DHCPV6_OPTION_NII
void UdpHdr(uint16_t len, in_addr_t src, uint16_t src_port, in_addr_t dest, uint16_t dest_port)
#define DHCPV6_OPTION_DOMAIN_LIST
const Ip6Address & primary_ip6_addr() const
#define DHCPV6_OPTION_RDNSS_SELECTION
#define DHCPV6_OPTION_IPv6_ADDRESS_ANDSF
#define DHCPV6_OPTION_CLT_TIME
#define DHCPV6_OPTION_PD_EXCLUDE
#define DHCPV6_OPTION_NIS_SERVERS
#define DHCPV6_OPTION_IPv6_FQDN_MoS
#define DHCPV6_OPTION_ERP_LOCAL_DOMAIN_NAME
const Interface * FindInterface(size_t index) const
void IncrStatsInformationRequest()
std::map< uint32_t, Dhcpv6Handler::DhcpOptionCategory >::const_iterator Dhcpv6CategoryIter
#define DHCPV6_OPTION_ORO
#define DHCPV6_OPTION_KRB_PRINCIPAL_NAME
const std::string & name() const
#define DHCPV6_OPTION_CLIENT_DATA
#define DHCPV6_OPTION_S46_DMR
void IncrStatsReconfigure()
#define DHCPV6_OPTION_IAPREFIX
#define DHCPV6_OPTION_INF_MAX_RT
#define DHCPV6_OPTION_S46_CONT_LW
#define DHCPV6_RECONFIGURE
#define DHCPV6_OPTION_UNICAST
bool is_dns_enabled() const
Dhcpv6Handler(Agent *agent, boost::shared_ptr< PktInfo > info, boost::asio::io_context &io)
#define DHCPV6_OPTION_MIP6_HAA
autogen::IpamType ipam_type_
#define DHCPV6_OPTION_ERO
#define DHCPV6_OPTION_IA_TA
bool IsIp6SubnetMember(const Ip6Address &ip, const Ip6Address &subnet, uint8_t plen)
Dhcpv6Options * GetNextOptionPtr(uint16_t optlen)
#define DHCPV6_OPTION_IAADDR
bool is_flag_set(uint8_t flag) const
#define DHCPV6_OPTION_NTP_SERVER
void DhcpTrace(const std::string &msg) const
Dhcpv6NameCodeMap g_dhcpv6_namecode_map
#define DHCPV6_INFORMATION_REQUEST
#define DHCPV6_OPTION_LQ_RELAY_DATA
void FillDhcpInfo(Ip6Address &addr, int plen, Ip6Address &gw, Ip6Address &dns)
#define DHCPV6_OPTION_MIP6_VDINF
#define DHCPV6_OPTION_SOL_MAX_RT
#define DHCPV6_OPTION_CAPWAP_AC_V6
void ReadOptions(int16_t opt_rem_len)
#define DHCPV6_CLIENT_PORT
#define DHCPV6_OPTION_REMOTE_ID