Config.h revision 94ca5c8512e71788df8958802417d5a3ac3f4268
051203e46846205a982bcf5ab198a8b5f6f8e6e0vboxsync * This file contains declarations of DHCP config.
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsynctypedef MacAddressContainer::iterator MacAddressIterator;
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsynctypedef std::vector<RTNETADDRIPV4> Ipv4AddressContainer;
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsynctypedef Ipv4AddressContainer::iterator Ipv4AddressIterator;
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsynctypedef Ipv4AddressContainer::const_iterator Ipv4AddressConstIterator;
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsyncstatic bool operator <(const RTNETADDRIPV4& a, const RTNETADDRIPV4& b)
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsyncstatic bool operator > (const RTNETADDRIPV4& a, const RTNETADDRIPV4& b)
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync return (b < a);
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsynctypedef std::map<Lease *, RTNETADDRIPV4> MapLease2Ip4Address;
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsynctypedef MapLease2Ip4Address::iterator MapLease2Ip4AddressIterator;
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsynctypedef MapLease2Ip4Address::value_type MapLease2Ip4AddressPair;
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync * it's a basic representation of
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync * of out undestanding what client is
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync * XXX: Client might sends Option 61 (RFC2132 9.14 "Client-identifier") signalling
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync * that we may identify it in special way
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync * XXX: Client might send Option 60 (RFC2132 9.13 "Vendor class undentifier")
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync * in response it's expected server sends Option 43 (RFC2132 8.4. "Vendor Specific Information")
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync /* XXX: Option 60 and 61 */
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync /** Dumps client query */
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync /* XXX! private: */
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync /* XXX: should be in lease */
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsynctypedef VecClient::const_iterator VecClientConstIterator;
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync virtual bool check(const Client& client) const {return false;};
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync ORClientMatchCriteria(ClientMatchCriteria *left, ClientMatchCriteria *right)
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync return (m_left->check(client) || m_right->check(client));
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync ANDClientMatchCriteria(ClientMatchCriteria *left, ClientMatchCriteria *right)
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync return (m_left->check(client) && m_right->check(client));
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsyncclass AnyClientMatchCriteria: public ClientMatchCriteria
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync return true;
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsyncclass MACClientMatchCriteria: public ClientMatchCriteria
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync MACClientMatchCriteria(const RTMAC& mac):m_mac(mac){}
051203e46846205a982bcf5ab198a8b5f6f8e6e0vboxsync/* XXX: Later */
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsyncclass VmSlotClientMatchCriteria: public ClientMatchCriteria
bec052941a2aeb2a3d3bb695b2b37652b64df758vboxsync/* Option 60 */
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsyncclass ClassClientMatchCriteria: ClientMatchCriteria{};
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync/* Option 61 */
304f31a2a37f5d690086bff2fb4a59228b4dbd40vboxsyncclass ClientIdentifierMatchCriteria: ClientMatchCriteria{};
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync BaseConfigEntity(const ClientMatchCriteria *criteria = NULL,
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync /* Should return how strong matching */
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync virtual int match(Client& client, BaseConfigEntity **cfg);
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync virtual uint32_t expirationPeriod() const {return 0;}
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync /* range */
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync /* match conditions */
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync /* XXX: private:*/
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync * Network specific entries
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync /* Address Pool matching with network declaration */
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync const RTNETADDRIPV4& upperIp() const {return m_UpperIP;}
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync const RTNETADDRIPV4& lowerIp() const {return m_LowerIP;}
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync const RTNETADDRIPV4& networkId() const {return m_NetworkID;}
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync const RTNETADDRIPV4& netmask() const {return m_NetworkMask;}
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync * Host specific entry
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync * Address pool is contains one element
e72d867f5d519d040e3e8a7f842e42bdc5120c5bvboxsync static_cast<const ConfigEntity*>(cfg), criteria, 10,
bec052941a2aeb2a3d3bb695b2b37652b64df758vboxsync /* upper addr == lower addr */
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync RootConfigEntity(std::string name, uint32_t expirationPeriod);
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync * Shared regions e.g. some of configured networks declarations
e579762795d321fd9390ae09c881e35c8107506fvboxsync * are cover each other.
bec052941a2aeb2a3d3bb695b2b37652b64df758vboxsync * XXX: Shared Network is join on Network config entities with possible
bec052941a2aeb2a3d3bb695b2b37652b64df758vboxsync * overlaps in address pools. for a moment we won't configure and use them them
bec052941a2aeb2a3d3bb695b2b37652b64df758vboxsyncclass SharedNetworkConfigEntity: public NetworkEntity
e579762795d321fd9390ae09c881e35c8107506fvboxsync int match(const Client& client) const { return m_criteria.match(client)? 3 : 0;}
bec052941a2aeb2a3d3bb695b2b37652b64df758vboxsync static ConfigurationManager* getConfigurationManager();
e579762795d321fd9390ae09c881e35c8107506fvboxsync static int extractRequestList(PCRTNETBOOTP pDhcpMsg, size_t cbDhcpMsg, RawOption& rawOpt);
75d67a5757951aa64bf3887a70db379e1feb84aavboxsync Client* getClientByDhcpPacket(const RTNETBOOTP *pDhcpMsg, size_t cbDhcpMsg);
e579762795d321fd9390ae09c881e35c8107506fvboxsync * XXX: it's could be done on DHCPOFFER or on DHCPACK (rfc2131 gives freedom here
e579762795d321fd9390ae09c881e35c8107506fvboxsync * 3.1.2, what is strict that allocation should do address check before real
bec052941a2aeb2a3d3bb695b2b37652b64df758vboxsync * allocation)...
bec052941a2aeb2a3d3bb695b2b37652b64df758vboxsync Lease* allocateLease4Client(Client *client, PCRTNETBOOTP pDhcpMsg, size_t cbDhcpMsg);
bec052941a2aeb2a3d3bb695b2b37652b64df758vboxsync * We call this before DHCPACK sent and after DHCPREQUEST received ...
bec052941a2aeb2a3d3bb695b2b37652b64df758vboxsync * when requested configuration is acceptable.
bec052941a2aeb2a3d3bb695b2b37652b64df758vboxsync * Expires client lease.
e579762795d321fd9390ae09c881e35c8107506fvboxsync static int findOption(uint8_t uOption, PCRTNETBOOTP pDhcpMsg, size_t cbDhcpMsg, RawOption& opt);
bec052941a2aeb2a3d3bb695b2b37652b64df758vboxsync NetworkConfigEntity *addNetwork(NetworkConfigEntity *pCfg,
bec052941a2aeb2a3d3bb695b2b37652b64df758vboxsync HostConfigEntity *addHost(NetworkConfigEntity*, const RTNETADDRIPV4&, ClientMatchCriteria*);
bec052941a2aeb2a3d3bb695b2b37652b64df758vboxsync int addToAddressList(uint8_t u8OptId, RTNETADDRIPV4& address);
bec052941a2aeb2a3d3bb695b2b37652b64df758vboxsync int setString(uint8_t u8OptId, const std::string& str);
e579762795d321fd9390ae09c881e35c8107506fvboxsync const Ipv4AddressContainer& getAddressList(uint8_t u8OptId);
bec052941a2aeb2a3d3bb695b2b37652b64df758vboxsync bool isAddressTaken(const RTNETADDRIPV4& addr, Lease** ppLease = NULL);
bec052941a2aeb2a3d3bb695b2b37652b64df758vboxsync /* nulls */
d365a9a356e68215d7111b8f676fa04db1b88c1fvboxsync * Here we can store expired Leases to do not re-allocate them latter.
d365a9a356e68215d7111b8f676fa04db1b88c1fvboxsync /* XXX: MapLease2Ip4Address m_freed; */
d365a9a356e68215d7111b8f676fa04db1b88c1fvboxsync /* XXX: more universal storages are required. */
d365a9a356e68215d7111b8f676fa04db1b88c1fvboxsync int offer4Client(Client* lease, uint32_t u32Xid, uint8_t *pu8ReqList, int cReqList);
d365a9a356e68215d7111b8f676fa04db1b88c1fvboxsync int ack(Client *lease, uint32_t u32Xid, uint8_t *pu8ReqList, int cReqList);
d365a9a356e68215d7111b8f676fa04db1b88c1fvboxsync const RTNETADDRIPV4& getOurAddress(){ return m_OurAddress;}
d365a9a356e68215d7111b8f676fa04db1b88c1fvboxsync const RTNETADDRIPV4& getOurNetmask(){ return m_OurNetmask;}
d365a9a356e68215d7111b8f676fa04db1b88c1fvboxsync void setOurAddress(const RTNETADDRIPV4& aAddress){ m_OurAddress = aAddress;}
d365a9a356e68215d7111b8f676fa04db1b88c1fvboxsync void setOurNetmask(const RTNETADDRIPV4& aNetmask){ m_OurNetmask = aNetmask;}
d365a9a356e68215d7111b8f676fa04db1b88c1fvboxsync void setOurMac(const RTMAC& aMac) {m_OurMac = aMac;}
d365a9a356e68215d7111b8f676fa04db1b88c1fvboxsync /* XXX: artifacts should be hidden or removed from here. */
d365a9a356e68215d7111b8f676fa04db1b88c1fvboxsync int prepareReplyPacket4Client(Client *client, uint32_t u32Xid);
d365a9a356e68215d7111b8f676fa04db1b88c1fvboxsync int processParameterReqList(Client *client, uint8_t *pu8ReqList, int cReqList);
d365a9a356e68215d7111b8f676fa04db1b88c1fvboxsync return (ASMDivU64ByU32RetU32(RTTimeMilliTS() - u64TimestampLeasingStarted, 1000)
d365a9a356e68215d7111b8f676fa04db1b88c1fvboxsync return (ASMDivU64ByU32RetU32(RTTimeMilliTS() - u64TimestampBindingStarted, 1000)
d365a9a356e68215d7111b8f676fa04db1b88c1fvboxsync /* XXX private: */
d365a9a356e68215d7111b8f676fa04db1b88c1fvboxsync /** lease isn't commited */
d365a9a356e68215d7111b8f676fa04db1b88c1fvboxsync /** Timestamp when lease commited. */
d365a9a356e68215d7111b8f676fa04db1b88c1fvboxsync /** Period when lease is expired in secs. */
d365a9a356e68215d7111b8f676fa04db1b88c1fvboxsync /** timestamp when lease was bound */
d365a9a356e68215d7111b8f676fa04db1b88c1fvboxsync /* Period when binding is expired in secs. */
d365a9a356e68215d7111b8f676fa04db1b88c1fvboxsync * Helper class for stuffing DHCP options into a reply packet.
d365a9a356e68215d7111b8f676fa04db1b88c1fvboxsync uint8_t *m_pbCur; /**< The current cursor position. */
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync uint8_t *m_pbEnd; /**< The end the current option space. */
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync uint8_t *m_pfOverload; /**< Pointer to the flags of the overload option. */
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync uint8_t m_fUsed; /**< Overload fields that have been used. */
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync bool m_fOverflowed; /**< Set if we've overflowed, otherwise false. */
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync /** Instantiate an option cursor for the specified DHCP message. */
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync VBoxNetDhcpWriteCursor(PRTNETBOOTP pDhcp, size_t cbDhcp) :
051203e46846205a982bcf5ab198a8b5f6f8e6e0vboxsync Assert(cbDhcp > RT_UOFFSETOF(RTNETBOOTP, bp_vend.Dhcp.dhcp_opts[10]));
051203e46846205a982bcf5ab198a8b5f6f8e6e0vboxsync /** Destructor. */
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync * Try use the bp_file field.
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync * @returns true if not overloaded, false otherwise.
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync return false;
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync return true;
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync * Try overload more BOOTP fields
4c303299e657f3cfd3c6db618e443b93e5b814a2vboxsync /* switch option area. */
bec052941a2aeb2a3d3bb695b2b37652b64df758vboxsync pbNewEnd = &m_pDhcp->bp_file[sizeof(m_pDhcp->bp_file)];
bec052941a2aeb2a3d3bb695b2b37652b64df758vboxsync pbNewEnd = &m_pDhcp->bp_sname[sizeof(m_pDhcp->bp_sname)];
bec052941a2aeb2a3d3bb695b2b37652b64df758vboxsync return false;
bec052941a2aeb2a3d3bb695b2b37652b64df758vboxsync /* Add an overload option. */
bec052941a2aeb2a3d3bb695b2b37652b64df758vboxsync /* pad current option field */
4c303299e657f3cfd3c6db618e443b93e5b814a2vboxsync *m_pbCur++ = RTNET_DHCP_OPT_PAD; /** @todo not sure if this stuff is at all correct... */
bec052941a2aeb2a3d3bb695b2b37652b64df758vboxsync /* switch */
4c303299e657f3cfd3c6db618e443b93e5b814a2vboxsync return true;
bec052941a2aeb2a3d3bb695b2b37652b64df758vboxsync * Begin an option.
4c303299e657f3cfd3c6db618e443b93e5b814a2vboxsync * @returns true on success, false if we're out of space.
75d67a5757951aa64bf3887a70db379e1feb84aavboxsync * @param uOption The option number.
bec052941a2aeb2a3d3bb695b2b37652b64df758vboxsync * @param cb The amount of data.
bec052941a2aeb2a3d3bb695b2b37652b64df758vboxsync /* Check that the data of the previous option has all been written. */
bec052941a2aeb2a3d3bb695b2b37652b64df758vboxsync || (m_pbCur - m_pOpt->dhcp_len == (uint8_t *)(m_pOpt + 1)));
bec052941a2aeb2a3d3bb695b2b37652b64df758vboxsync /* Check if we need to overload more stuff. */
bec052941a2aeb2a3d3bb695b2b37652b64df758vboxsync if ((uintptr_t)(m_pbEnd - m_pbCur) < cb + 2 + (m_pfOverload ? 1 : 3))
bec052941a2aeb2a3d3bb695b2b37652b64df758vboxsync AssertMsgFailedReturn(("%u %#x\n", uOption, cb), false);
bec052941a2aeb2a3d3bb695b2b37652b64df758vboxsync AssertMsgFailedReturn(("%u %#x\n", uOption, cb), false);
bec052941a2aeb2a3d3bb695b2b37652b64df758vboxsync /* Emit the option header. */
bec052941a2aeb2a3d3bb695b2b37652b64df758vboxsync return true;
bec052941a2aeb2a3d3bb695b2b37652b64df758vboxsync * Puts option data.
bec052941a2aeb2a3d3bb695b2b37652b64df758vboxsync * @param pvData The data.
bec052941a2aeb2a3d3bb695b2b37652b64df758vboxsync * @param cb The amount to put.
bec052941a2aeb2a3d3bb695b2b37652b64df758vboxsync Assert((uintptr_t)m_pbCur - (uintptr_t)(m_pOpt + 1) + cb <= (size_t)m_pOpt->dhcp_len);
4c303299e657f3cfd3c6db618e443b93e5b814a2vboxsync * Puts an IPv4 Address.
4c303299e657f3cfd3c6db618e443b93e5b814a2vboxsync * @param IPv4Addr The address.
4c303299e657f3cfd3c6db618e443b93e5b814a2vboxsync * Adds an IPv4 address option.
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync * @returns true/false just like begin().
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync * @param uOption The option number.
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync * @param IPv4Addr The address.
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync bool optIPv4Addr(uint8_t uOption, RTNETADDRIPV4 IPv4Addr)
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync return false;
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync return true;
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync * Adds an option taking 1 or more IPv4 address.
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync * If the vector contains no addresses, the option will not be added.
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync * @returns true/false just like begin().
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync * @param uOption The option number.
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync * @param rIPv4Addrs Reference to the address vector.
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync bool optIPv4Addrs(uint8_t uOption, std::vector<RTNETADDRIPV4> const &rIPv4Addrs)
051203e46846205a982bcf5ab198a8b5f6f8e6e0vboxsync return true;
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync return false;
dbabcd810984fc0731edff08eb281f0907dc867avboxsync for (size_t i = 0; i < c; i++)
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync return true;
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync * Puts an 8-bit integer.
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync * @param u8 The integer.
4c7080424765b6ab6900953b3736e857318a6126vboxsync * Adds an 8-bit integer option.
bec052941a2aeb2a3d3bb695b2b37652b64df758vboxsync * @returns true/false just like begin().
bec052941a2aeb2a3d3bb695b2b37652b64df758vboxsync * @param uOption The option number.
bec052941a2aeb2a3d3bb695b2b37652b64df758vboxsync * @param u8 The integer
bec052941a2aeb2a3d3bb695b2b37652b64df758vboxsync return false;
d6a533c77fa274df5ee0e592c6abfa73549f2b34vboxsync return true;
bec052941a2aeb2a3d3bb695b2b37652b64df758vboxsync * Puts an 32-bit integer (network endian).
bec052941a2aeb2a3d3bb695b2b37652b64df758vboxsync * @param u32Network The integer.
bec052941a2aeb2a3d3bb695b2b37652b64df758vboxsync * Adds an 32-bit integer (network endian) option.
bec052941a2aeb2a3d3bb695b2b37652b64df758vboxsync * @returns true/false just like begin().
bec052941a2aeb2a3d3bb695b2b37652b64df758vboxsync * @param uOption The option number.
bec052941a2aeb2a3d3bb695b2b37652b64df758vboxsync * @param u32Network The integer.
bec052941a2aeb2a3d3bb695b2b37652b64df758vboxsync return false;
bec052941a2aeb2a3d3bb695b2b37652b64df758vboxsync return true;
bec052941a2aeb2a3d3bb695b2b37652b64df758vboxsync * Puts a std::string.
bec052941a2aeb2a3d3bb695b2b37652b64df758vboxsync * @param rStr Reference to the string.
bec052941a2aeb2a3d3bb695b2b37652b64df758vboxsync * Adds an std::string option if the string isn't empty.
d6a533c77fa274df5ee0e592c6abfa73549f2b34vboxsync * @returns true/false just like begin().
bec052941a2aeb2a3d3bb695b2b37652b64df758vboxsync * @param uOption The option number.
4c7080424765b6ab6900953b3736e857318a6126vboxsync * @param rStr Reference to the string.
bec052941a2aeb2a3d3bb695b2b37652b64df758vboxsync bool optStr(uint8_t uOption, std::string const &rStr)
bec052941a2aeb2a3d3bb695b2b37652b64df758vboxsync return true;
bec052941a2aeb2a3d3bb695b2b37652b64df758vboxsync return false;
d6a533c77fa274df5ee0e592c6abfa73549f2b34vboxsync return true;
bec052941a2aeb2a3d3bb695b2b37652b64df758vboxsync * Whether we've overflowed.
4c7080424765b6ab6900953b3736e857318a6126vboxsync * @returns true on overflow, false otherwise.
2087cc1f185f94ea367e4bba400e039159e7ec3cvboxsync bool hasOverflowed(void) const
4c7080424765b6ab6900953b3736e857318a6126vboxsync * Adds the terminating END option.
4c7080424765b6ab6900953b3736e857318a6126vboxsync * The END will always be added as we're reserving room for it, however, we
4c7080424765b6ab6900953b3736e857318a6126vboxsync * might have dropped previous options due to overflows and that is what the
4c7080424765b6ab6900953b3736e857318a6126vboxsync * return status indicates.
bec052941a2aeb2a3d3bb695b2b37652b64df758vboxsync * @returns true on success, false on a (previous) overflow.