15 #include "services/services_types.h"
22 #include <boost/assign/list_of.hpp>
25 using namespace boost::assign;
27 map_list_of<std::string, uint32_t>
177 map_list_of<uint32_t, DhcpHandler::DhcpOptionCategory>
328 boost::asio::io_context &io)
331 nak_msg_(
"cannot assign requested address") {
354 if (options_len < 0) {
356 DHCP_TRACE(Error,
"Improper DHCP packet length; vrf = " <<
368 DHCP_TRACE(Error,
"Received DHCP packet on invalid interface : "
375 DHCP_TRACE(Error,
"Received DHCP packet on non VM port interface : "
382 DHCP_TRACE(Error,
"DHCP request on VM port with dhcp services disabled: "
389 DHCP_TRACE(Error,
"DHCP request for incorrect MAC: interface = "
434 DHCP_TRACE(Error,
"DHCP Client declined the offer : vrf = " <<
443 DHCP_TRACE(Error,
"DHCP lease released : vrf = " <<
481 if (
agent()->GetDhcpProto()->dhcp_relay_mode())
514 if ((opt_rem_len < 4) ||
517 DHCP_TRACE(Error,
"DHCP options cookie missing; vrf = " <<
533 if (opt_rem_len >= opt->
len + 2)
538 if (opt_rem_len >= opt->
len + 2) {
540 uint8_t data[
sizeof(in_addr_t)];
543 memcpy(bytes.data, opt->
data,
sizeof(in_addr_t));
549 if (opt_rem_len >= opt->
len + 2)
554 if (opt_rem_len >= opt->
len + 2)
559 if (opt_rem_len >= opt->
len + 2)
570 opt_rem_len -= (2 + opt->
len);
581 uint32_t mask = plen? (0xFFFFFFFF << (32 - plen)) : 0;
598 DHCP_TRACE(Error,
"DHCP request from Gateway interface failed :"
599 " could not allocate IP address for Mac : " <<
612 " could not be served - DHCP lease db is not created");
620 DHCP_TRACE(Error,
"DHCP lease release failed : vrf = " <<
645 boost::system::error_code ec;
647 Ip4Address::from_string(
"169.254.0.0", ec), rt->
prefix_length())) {
654 DHCP_TRACE(Error,
"DHCP fabric port request failed : "
655 "could not find route for " << ip.to_string());
661 for (i = 0; i < ipam.size(); ++i) {
662 if (!ipam[i].IsV4()) {
667 Ip4Address default_gw = ipam[i].default_gw.to_v4();
668 Ip4Address service_address = ipam[i].dns_server.to_v4();
669 if (service_address.is_unspecified())
670 service_address = default_gw;
671 FillDhcpInfo(ip, ipam[i].plen, default_gw, service_address);
684 boost::system::error_code ec;
686 (
agent()->v4_link_local_subnet(), ec);
710 for (
int i = 0; i < 2; i++) {
711 switch (subopt->
code) {
713 if (subopt->
len !=
sizeof(uint32_t))
716 uint8_t data[
sizeof(uint32_t)];
720 memcpy(bytes.data, subopt->
data,
sizeof(uint32_t));
748 agent()->GetDhcpProto()->ip_fabric_interface_index(),
749 agent()->GetDhcpProto()->ip_fabric_interface_mac(),
759 int16_t opt_rem_len = in_pkt_info.
len - eth_len -
sizeof(
struct ip)
760 - sizeof(udphdr) - DHCP_FIXED_LEN - 4;
761 uint16_t opt_len = 4;
765 switch (read_opt->
code) {
796 opt_rem_len -= (2 + read_opt->
len);
801 dhcp->
giaddr = htonl(
agent()->router_id().to_ulong());
808 uint32_t len = DHCP_FIXED_LEN + opt_len + eth_len +
sizeof(udphdr);
812 len +=
sizeof(
struct ip);
813 IpHdr(len, htonl(
agent()->router_id().to_ulong()),
827 uint16_t eth_len = 0;
829 agent()->vhost_interface()->mac(),
840 uint16_t opt_len = 4;
844 switch (read_opt->
code) {
867 opt_rem_len -= (2 + read_opt->
len);
881 uint32_t len =
DHCP_FIXED_LEN + opt_len +
sizeof(udphdr) + eth_len;
885 len +=
sizeof(
struct ip);
886 IpHdr(len, htonl(
agent()->router_id().to_ulong()),
903 DHCP_TRACE(
Trace,
"Ignoring received DHCP packet from fabric interface");
925 boost::system::error_code ec;
926 uint32_t ip = Ip4Address::from_string(input, ec).to_ulong();
927 if (!ec.value() && ip) {
929 option_->AppendData(4, &ip, &opt_len);
932 " data : " << input <<
" for VM " <<
940 if (
ipam_type_.ipam_dns_method ==
"virtual-dns-server") {
970 uint16_t opt_len = 4;
971 option_->SetNextOptionPtr(opt_len);
974 option_->SetNextOptionPtr(opt_len);
978 option_->SetNextOptionPtr(opt_len);
985 option_->SetNextOptionPtr(opt_len);
991 option_->SetNextOptionPtr(opt_len);
1001 option_->SetNextOptionPtr(opt_len);
1007 option_->SetNextOptionPtr(opt_len);
1011 option_->SetNextOptionPtr(opt_len);
1018 option_->SetNextOptionPtr(opt_len);
1024 uint16_t old_opt_len = opt_len;
1025 option_->SetNextOptionPtr(opt_len);
1029 if (opt_len == old_opt_len +
option_->GetFixedLen())
1030 opt_len = old_opt_len;
1034 option_->SetNextOptionPtr(opt_len);
1044 option_->SetNextOptionPtr(opt_len);
1052 in_addr_t src_ip, in_addr_t dest_ip,
1053 in_addr_t siaddr, in_addr_t yiaddr) {
1056 uint16_t eth_len = 0;
1068 uint16_t len =
DhcpHdr(yiaddr, siaddr);
1069 len +=
sizeof(udphdr);
1071 len +=
sizeof(
struct ip);
1075 return pkt_info_->packet_buffer()->data_len();
1085 in_addr_t dest_ip = 0xFFFFFFFF;
1087 in_addr_t siaddr = src_ip;
1113 uint32_t
interface =
1124 for (uint32_t i = 0; i <
parameters_.size(); i++) {
1157 return iter->second;
1163 std::stringstream str(option);
1167 if (code)
return code;
1173 return iter->second;
1176 std::stringstream str_new(option);
1178 bool is_delimeter_set =
false;
1179 while(!(str_new.eof())){
1181 if (str_new.peek() ==
','){
1182 is_delimeter_set =
true;
1185 std::stringstream str_orig(option);
1188 if(is_delimeter_set){
1190 while (str_orig.good()) {
1192 getline(str_orig, substr,
',');
1193 v.push_back(substr);
1195 std::stringstream str_temp(v[1]);
#define DHCP_OPTION_ALL_SUBNETS_LOCAL
uint8_t prefix_length() const
!
uint16_t DhcpHdr(in_addr_t, in_addr_t)
#define DHCP_OPTION_DATA_SOURCE
#define DHCP_OPTION_TIME_OFFSET
#define DHCP_OPTION_NETWARE_IP_INFO
bool IsRouterOptionNeeded()
void ReleaseGatewayInterfaceLease()
uint32_t pkt_interface_index() const
#define DHCP_OPTION_NETBIOS_OVER_TCP_NODE_TYPE
const MacAddress & vm_mac() const
#define DHCP_OPTION_ETHERNET_ENCAP
#define DHCP_OPTION_QUERY_END_TIME
#define DHCP_OPTION_STREETTALK_SERVER
std::map< std::string, uint32_t >::const_iterator Dhcpv4NameCodeIter
#define DHCP_OPTION_MSG_TYPE
#define DHCP_OPTION_NDS_SERVERS
void FindDomainName(const IpAddress &vm_addr)
std::map< std::string, uint32_t > Dhcpv4NameCodeMap
bool GetGatewayInterfaceLease()
#define DHCP_OPTION_TCP_KEEPALIVE_GARBAGE
#define DHCP_OPTION_ROOT_PATH
#define DHCP_OPTION_IPV4_ADDRESS_MOS
uint8_t options[DHCP_MAX_OPTION_LEN]
#define DHCP_OPTION_NNTP_SERVER
#define DHCP_OPTION_PCP_SERVER
#define DHCP_OPTION_CLIENT_MACHINE_ID
#define DHCP_LEASE_UNASSIGNED
uint16_t AddConfigDhcpOptions(uint16_t opt_len, bool is_v6)
#define DHCP_OPTION_TFTP_SERVER_NAME
boost::scoped_ptr< DhcpOptionHandler > option_
bool ToArray(u_int8_t *p, size_t s) const
Dhcpv4Options * GetNextOptionPtr()
void DhcpTrace(const std::string &msg) const
const boost::uuids::uuid & GetUuid() const
const uint32_t id() const
#define DHCP_OPTION_POP_SERVER
#define DHCP_OPTION_IP_LEASE_TIME
const VnIpam * GetIpam(const IpAddress &ip) const
#define DHCP_OPTION_MERIT_DUMP_FILE
bool IsIp4SubnetMember(const Ip4Address &ip, const Ip4Address &prefix_ip, uint16_t plen)
bool dhcp_enable_config() const
const Interface * vhost_interface() const
VmInterface::DeviceType device_type() const
#define DHCP_TRACE(obj, arg)
#define DHCP_OPTION_IPV4_ADDRESS_ANDSF
DhcpLeaseDb * GetLeaseDb(Interface *intrface)
boost::asio::ip::address IpAddress
#define DHCP_OPTION_NIS_DOMAIN
uint8_t sname[DHCP_NAME_LEN]
#define DHCP_LEASE_ACTIVE
#define DHCP_OPTION_NAME_SERVER
#define DHCP_OPTION_NIS_PLUS_SERVERS
#define DHCP_OPTION_NL_SRC_ROUTING
#define DHCP_OPTION_CLIENT_FQDN
#define DHCP_OPTION_REQ_IP_ADDRESS
#define DHCP_OPTION_SUBNET_ALLOCATION
std::unique_ptr< DBRequestData > data
std::map< uint32_t, DhcpHandler::DhcpOptionCategory > Dhcpv4CategoryMap
void UpdateData(uint32_t id, uint16_t fl, uint8_t *mac)
#define DHCP_OPTION_SLP_SERVICE_SCOPE
#define DHCP_OPTION_NETBIOS_OVER_TCP_SCOPE
const Ip4Address & subnet() const
InterfaceTable * interface_table() const
bool Enqueue(DBRequest *req)
struct ether_header * eth
#define DHCP_OPTION_OPENGROUP_USER_AUTH
#define DHCP_LEASE_UNKNOWN
#define DHCP_OPTION_NETBIOS_OVER_TCP_DG_DS
const string & GetName() const
const MacAddress & mac() const
AddressList vhost_default_gateway() const
#define DHCP_SUBOP_REMOTEID
Dhcpv4CategoryMap g_dhcpv4_category_map
#define DHCP_OPTION_STREETTALK_DA_SERVER
#define DHCP_OPTION_DEFAULT_WWW_SERVER
uint8_t chaddr[DHCP_CHADDR_LEN]
void IncrStatsRelayReqs()
#define DHCP_OPTION_TFTP_SERVER_ADDRESS
boost::shared_ptr< PktInfo > pkt_info_
void AddDhcpSnoopEntry(const std::string &ifname, const Ip4Address &addr)
#define DHCP_OPTION_PERFORM_MASK_DISCOVERY
#define DHCP_OPTION_PARAMETER_REQUEST_LIST
#define DHCP_OPTION_CLASS_ID
#define DHCP_OPTION_ROUTER_SOLICIT_ADDRESS
std::string ToString() const
#define DHCP_OPTION_GEOLOC
#define DHCP_OPTION_CLIENT_ID
#define DHCP_OPTION_BASE_TIME
#define DHCP_OPTION_PXE_VENDOR_SPECIFIC_129
bool CreateRelayResponsePacket()
#define DHCP_OPTION_REBOOT_TIME
#define DHCP_OPTION_NETWARE_IP_DOMAIN_NAME
uint16_t AddDnsServers(uint16_t opt_len)
#define DHCP_OPTION_NDS_CONTEXT
int EthHdr(const MacAddress &src, const MacAddress &dest, const uint16_t proto)
#define DHCP_OPTION_DEFAULT_IP_TTL
#define DHCP_OPTION_PXE_VENDOR_SPECIFIC_130
uint16_t AddClasslessRouteOption(uint16_t opt_len)
#define DHCP_OPTIONS_COOKIE
static std::string & DhcpMsgType(uint32_t msg_type)
#define DHCP_OPTION_DEFAULT_TCP_TTL
DhcpHandler(Agent *agent, boost::shared_ptr< PktInfo > info, boost::asio::io_context &io)
DhcpProto * GetDhcpProto() const
#define DHCP_OPTION_PXE_VENDOR_SPECIFIC_135
uint32_t GetInterfaceIndex() const
#define DHCP_OPTION_PXE_VENDOR_SPECIFIC_132
bool ReadOptions(int16_t opt_rem_len)
#define DHCP_OPTION_NETINFO_PARENT_SERVER_ADDR
#define DHCP_OPTION_TFTP_SERVER
#define DHCP_OPTION_SUBNET_MASK
#define DHCP_OPTION_AUTO_CONFIGURE
#define DHCP_OPTION_NETBIOS_OVER_TCP_NS
#define DHCP_OPTION_DEFAULT_IRC_SERVER
uint16_t FillDhcpResponse(const MacAddress &dest_mac, in_addr_t src_ip, in_addr_t dest_ip, in_addr_t siaddr, in_addr_t yiaddr)
bool Allocate(const MacAddress &mac, Ip4Address *address, uint64_t lease)
#define DHCP_OPTION_PXE_VENDOR_SPECIFIC_131
#define DHCP_OPTION_PERFORM_ROUTER_DISCOVERY
void RelayResponseFromFabric()
#define DHCP_OPTION_SWAP_SERVER
#define DHCP_OPTION_SLP_DIRECTORY_AGENT
#define DHCP_OPTION_USER_CLASS_INFO
std::unique_ptr< DBRequestKey > key
#define DHCP_OPTION_VENDOR_ID_VENDOR_SPECIFIC
bool IsOptionRequested(uint8_t option)
void Send(uint32_t itf, uint32_t vrf, uint16_t, PktHandler::PktModuleName)
#define DHCP_OPTION_IP_FWD_CONTROL
#define DHCP_OPTION_BCMCS_DN_LIST
#define DHCP_OPTION_IMPRESS_SERVER
#define DHCP_OPTION_EXTENSION_PATH
#define DHCP_OPTION_CLIENT_LAST_XTIME
#define DHCP_OPTION_NIS_SERVERS
#define DHCP_OPTION_NIS_PLUS_DOMAIN
#define DHCP_OPTION_OVERLOAD
bool ReadOption82(Dhcpv4Options *opt)
#define DHCP_OPTION_NTP_SERVERS
#define DHCP_OPTION_CLIENT_NW_INTERFACE_ID
const std::vector< VnIpam > & GetVnIpam() const
static const MacAddress & BroadcastMac()
const VnEntry * vn() const
DhcpHandler::DhcpOptionCategory OptionCategory(uint32_t option) const
#define DHCP_OPTION_RENEW_TIME_VALUE
#define DHCP_OPTION_SMTP_SERVER
#define DHCP_OPTION_POLICY_FILTER
void FillDhcpInfo(Ip4Address &addr, int plen, Ip4Address &gw, Ip4Address &dns)
const uint32_t vrf_id() const
#define DHCP_OPTION_HOST_NAME
void WriteOption82(Dhcpv4Options *opt, uint16_t *optlen)
void WriteData(uint8_t c, uint8_t l, const void *d, uint16_t *optlen)
uint16_t AddIpv4Option(uint32_t option, uint16_t opt_len, const std::string &input, uint8_t min_count, uint8_t max_count, uint8_t multiples)
#define DHCP_OPTION_BCAST_ADDRESS
virtual const PrefixType & prefix_address() const
Returns the value of a stored prefix address (IPv4, IPv6 or MAC address)
boost::asio::ip::address_v4 Ip4Address
#define DHCP_OPTION_CLIENT_SYSARCH_TYPE
const Ip4Address & primary_ip_addr() const
void RelayRequestToFabric()
#define DHCP_OPTION_PXE_VENDOR_SPECIFIC_133
uint16_t AddIP(uint16_t opt_len, const std::string &input)
#define DHCP_OPTION_NAME_SERVICE_SEARCH
#define DHCP_OPTION_START_TIME_OF_STATE
#define DHCP_OPTION_INTERFACE_MTU
#define DHCP_OPTION_QUERY_START_TIME
void IncrUnknownMsgDrops()
const std::string & vm_name() const
#define DHCP_OPTION_REBIND_TIME_VALUE
bool HandleDhcpFromFabric()
#define DHCP_OPTION_LOST_SERVER
VmInterface::VmiType vmi_type() const
void UdpHdr(uint16_t len, in_addr_t src, uint16_t src_port, in_addr_t dest, uint16_t dest_port)
#define DHCP_OPTION_RAPID_COMMIT
void IncrDhcpDisabledDrops()
#define DHCP_OPTION_PATH_MTU_AGING_TIMEOUT
#define DHCP_OPTION_PATH_MTU_PLATEAU_TABLE
#define DHCP_OPTION_STATIC_ROUTING_TABLE
#define DHCP_OPTION_TIME_SERVER
#define DHCP_OPTION_GEOCONF
#define DHCP_OPTION_VENDOR_ID_VENDOR_CLASS
#define DHCP_OPTION_PANA_AUTH_AGENT
bool Release(const MacAddress &mac)
uint32_t OptionCode(const std::string &option) const
#define DHCP_OPTION_SIP_SERVERS
#define DHCP_OPTION_CAPWAP_AC_ADDRESS
#define DHCP_OPTION_PXE_VENDOR_SPECIFIC_134
const Interface * FindInterface(size_t index) const
#define DHCP_OPTION_ASSOCIATE_IP
#define DHCP_OPTION_NETINFO_PARENT_SERVER_TAG
#define DHCP_OPTION_DEFAULT_FINGER_SERVER
#define DHCP_OPTION_XWINDOW_FONT_SERVER
#define DHCP_OPTION_XWINDOW_SYSTEM_DISP_MGR
#define DHCP_OPTION_DNS_DOMAIN_SEARCH_LIST
const std::string & name() const
#define DHCP_OPTION_STORAGE_NS
std::map< uint32_t, DhcpHandler::DhcpOptionCategory >::const_iterator Dhcpv4CategoryIter
#define DHCP_OPTION_GEOCONF_CIVIC
#define DHCP_OPTION_REF_TZ_DB
bool do_dhcp_relay() const
bool dhcp_relay_mode() const
#define DHCP_OPTION_MOBILE_IP_HA
uint32_t ip_fabric_interface_index() const
void WriteByte(uint8_t c, uint16_t *optlen)
#define DHCP_OPTION_DOMAIN_NAME
#define DHCP_OPTION_QUOTE_SERVER
#define DHCP_SHORTLEASE_TIME
#define DHCP_OPTION_IPV4_FQDN_MOS
#define DHCP_OPTION_STATUS_CODE
#define DHCP_OPTION_RDNSS_SELECTION
#define DHCP_OPTION_FORCERENEW_NONCE_CAP
#define DHCP_OPTION_VENDOR_SPECIFIC_INFO
Dhcpv4NameCodeMap g_dhcpv4_namecode_map
#define DHCP_OPTION_PXELINUX_MAGIC
#define DHCP_OPTION_SERVER_IDENTIFIER
#define DHCP_GW_LEASE_TIME
#define DHCP_OPTION_PATH_PREFIX
bool is_dns_enabled() const
#define DHCP_OPTION_CONFIG_FILE
#define DHCP_OPTION_LPR_SERVER
uint8_t file[DHCP_FILE_LEN]
#define DHCP_OPTION_ARP_CACHE_TIMEOUT
#define DHCP_OPTION_BCMCS_ADDR_LIST
autogen::IpamType ipam_type_
#define DHCP_OPTION_LOG_SERVER
#define DHCP_OPTION_TRAILER_ENCAP
#define DHCP_OPTION_TCP_KEEPALIVE_INTERVAL
#define DHCP_OPTION_CLASSLESS_ROUTE
#define DHCP_OPTION_V4_ACCESS_DOMAIN
InetUnicastRouteEntry * FindResolveRoute(const Ip4Address &ip)
#define DHCP_OPTION_BOOTFILE_NAME
bool is_flag_set(uint8_t flag) const
#define DHCP_OPTION_MESSAGE
#define DHCP_OPTION_DHCP_STATE
#define DHCP_OPTION_MAX_DHCP_MSG_SIZE
#define DHCP_OPTION_BOOT_FILE_SIZE
#define DHCP_OPTION_RESOURCE_LOCATION_SERVER
void IpHdr(uint16_t len, in_addr_t src, in_addr_t dest, uint8_t protocol, uint16_t id, uint8_t ttl)
void IncrStatsRelayResps()
#define DHCP_OPTION_SUBNET_SELECTION
#define DHCP_OPTION_IEEE_1003_1_TZ
#define DHCP_OPTION_MAX_DG_REASSEMBLY_SIZE
#define DHCP_OPTION_ROUTER
uint16_t AddDomainNameOption(uint16_t opt_len)
#define DHCP_OPTION_NDS_TREE_NAME
#define DHCP_OPTION_SIP_UA_CONFIG_DOMAIN
#define DHCP_OPTION_MASK_SUPPLIER