Config.h revision 94ca5c8512e71788df8958802417d5a3ac3f4268
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync/* $Id$ */
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync/**
051203e46846205a982bcf5ab198a8b5f6f8e6e0vboxsync * This file contains declarations of DHCP config.
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync */
71ca11d26aa3d715423a305b1c25582f0a5f4f7fvboxsync
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync#ifndef _CONFIG_H_
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync# define _CONFIG_H_
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync#include <iprt/asm-math.h>
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync#include <iprt/cpp/utils.h>
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsynctypedef std::vector<RTMAC> MacAddressContainer;
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsynctypedef MacAddressContainer::iterator MacAddressIterator;
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsynctypedef std::vector<RTNETADDRIPV4> Ipv4AddressContainer;
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsynctypedef Ipv4AddressContainer::iterator Ipv4AddressIterator;
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsynctypedef Ipv4AddressContainer::const_iterator Ipv4AddressConstIterator;
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsyncstatic bool operator <(const RTNETADDRIPV4& a, const RTNETADDRIPV4& b)
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync{
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync return (RT_N2H_U32(a.u) < RT_N2H_U32(b.u));
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync}
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsyncstatic bool operator > (const RTNETADDRIPV4& a, const RTNETADDRIPV4& b)
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync{
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync return (b < a);
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync}
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsyncclass RawOption
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync{
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsyncpublic:
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync uint8_t u8OptId;
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync uint8_t cbRawOpt;
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync uint8_t au8RawOpt[255];
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync};
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsyncclass Client;
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsyncclass Lease;
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsyncclass BaseConfigEntity;
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsyncclass NetworkConfigEntity;
6160306df39548f807965d1b3e6953ca2ce92847vboxsyncclass HostConfigEntity;
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsyncclass ClientMatchCriteria;
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsynctypedef std::map<Lease *, RTNETADDRIPV4> MapLease2Ip4Address;
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsynctypedef MapLease2Ip4Address::iterator MapLease2Ip4AddressIterator;
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsynctypedef MapLease2Ip4Address::value_type MapLease2Ip4AddressPair;
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync/*
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 *
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 */
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsyncclass Client
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync{
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync public:
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync /* XXX: Option 60 and 61 */
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync Client(const RTMAC& mac);
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync bool operator== (const RTMAC& mac) const
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync {
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync return ( m_mac.au16[0] == mac.au16[0]
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync && m_mac.au16[1] == mac.au16[1]
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync && m_mac.au16[2] == mac.au16[2]);
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync }
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync /** Dumps client query */
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync void dump();
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync /* XXX! private: */
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync RTMAC m_mac;
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync Lease *m_lease;
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync /* XXX: should be in lease */
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync std::vector<RawOption> rawOptions;
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync};
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsynctypedef std::vector<Client*> VecClient;
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsynctypedef VecClient::iterator VecClientIterator;
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsynctypedef VecClient::const_iterator VecClientConstIterator;
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync/**
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync *
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync */
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsyncclass ClientMatchCriteria
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync{
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync public:
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync virtual bool check(const Client& client) const {return false;};
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync};
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsyncclass ORClientMatchCriteria: ClientMatchCriteria
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync{
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync ClientMatchCriteria* m_left;
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync ClientMatchCriteria* m_right;
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync ORClientMatchCriteria(ClientMatchCriteria *left, ClientMatchCriteria *right)
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync {
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync m_left = left;
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync m_right = right;
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync }
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync virtual bool check(const Client& client) const
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync {
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync return (m_left->check(client) || m_right->check(client));
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync }
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync};
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsyncclass ANDClientMatchCriteria: ClientMatchCriteria
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync{
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync ClientMatchCriteria* m_left;
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync ClientMatchCriteria* m_right;
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync ANDClientMatchCriteria(ClientMatchCriteria *left, ClientMatchCriteria *right)
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync {
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync m_left = left;
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync m_right = right;
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync }
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync virtual bool check(const Client& client) const
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync {
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync return (m_left->check(client) && m_right->check(client));
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync }
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync};
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsyncclass AnyClientMatchCriteria: public ClientMatchCriteria
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync{
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync virtual bool check(const Client& client) const
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync {
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync return true;
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync }
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync};
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsyncclass MACClientMatchCriteria: public ClientMatchCriteria
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync{
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync public:
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync MACClientMatchCriteria(const RTMAC& mac):m_mac(mac){}
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync virtual bool check(const Client& client) const
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync {
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync return (client == m_mac);
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync }
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync private:
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync RTMAC m_mac;
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync};
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync#if 0
051203e46846205a982bcf5ab198a8b5f6f8e6e0vboxsync/* XXX: Later */
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsyncclass VmSlotClientMatchCriteria: public ClientMatchCriteria
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync{
e39cffdec314db08b1b3405c4ccd56728eaaa76avboxsync str::string VmName;
e39cffdec314db08b1b3405c4ccd56728eaaa76avboxsync uint8_t u8Slot;
e39cffdec314db08b1b3405c4ccd56728eaaa76avboxsync virtual bool check(const Client& client)
e39cffdec314db08b1b3405c4ccd56728eaaa76avboxsync {
e39cffdec314db08b1b3405c4ccd56728eaaa76avboxsync return ( client.VmName == VmName
e39cffdec314db08b1b3405c4ccd56728eaaa76avboxsync && ( u8Slot == (uint8_t)~0 /* any */
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync || client.u8Slot == u8Slot));
bec052941a2aeb2a3d3bb695b2b37652b64df758vboxsync }
bec052941a2aeb2a3d3bb695b2b37652b64df758vboxsync};
bec052941a2aeb2a3d3bb695b2b37652b64df758vboxsync#endif
bec052941a2aeb2a3d3bb695b2b37652b64df758vboxsync
bec052941a2aeb2a3d3bb695b2b37652b64df758vboxsync
bec052941a2aeb2a3d3bb695b2b37652b64df758vboxsync/* Option 60 */
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsyncclass ClassClientMatchCriteria: ClientMatchCriteria{};
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync/* Option 61 */
304f31a2a37f5d690086bff2fb4a59228b4dbd40vboxsyncclass ClientIdentifierMatchCriteria: ClientMatchCriteria{};
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync
304f31a2a37f5d690086bff2fb4a59228b4dbd40vboxsync
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsyncclass BaseConfigEntity
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync{
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsyncpublic:
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync BaseConfigEntity(const ClientMatchCriteria *criteria = NULL,
051203e46846205a982bcf5ab198a8b5f6f8e6e0vboxsync int matchingLevel = 0)
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync : m_criteria(criteria),
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync m_MatchLevel(matchingLevel){};
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync virtual ~BaseConfigEntity(){};
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync /* XXX */
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync int add(BaseConfigEntity *cfg)
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync {
dbabcd810984fc0731edff08eb281f0907dc867avboxsync m_children.push_back(cfg);
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync return 0;
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync }
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync /* Should return how strong matching */
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync virtual int match(Client& client, BaseConfigEntity **cfg);
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync virtual uint32_t expirationPeriod() const = 0;
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync protected:
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync const ClientMatchCriteria *m_criteria;
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync int m_MatchLevel;
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync std::vector<BaseConfigEntity *> m_children;
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync};
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsyncclass NullConfigEntity: public BaseConfigEntity
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync{
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsyncpublic:
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync NullConfigEntity(){}
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync virtual ~NullConfigEntity(){}
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync int add(BaseConfigEntity *cfg) const
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync {
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync return 0;
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync }
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync virtual uint32_t expirationPeriod() const {return 0;}
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync};
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync
bf721ef38b15c00c9bbfcedb11dbc61f8bd71816vboxsync
061168b301e15895799842f766644c211b8701c9vboxsyncclass ConfigEntity: public BaseConfigEntity
bf721ef38b15c00c9bbfcedb11dbc61f8bd71816vboxsync{
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync public:
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync /* range */
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync /* match conditions */
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync ConfigEntity(std::string& name,
051203e46846205a982bcf5ab198a8b5f6f8e6e0vboxsync const BaseConfigEntity *cfg,
051203e46846205a982bcf5ab198a8b5f6f8e6e0vboxsync const ClientMatchCriteria *criteria,
f2cb8c82257cb6af3622059e397d46af7c774b63vboxsync int matchingLevel = 0):
f2cb8c82257cb6af3622059e397d46af7c774b63vboxsync BaseConfigEntity(criteria, matchingLevel),
f2cb8c82257cb6af3622059e397d46af7c774b63vboxsync m_name(name),
bec052941a2aeb2a3d3bb695b2b37652b64df758vboxsync m_parentCfg(cfg),
bec052941a2aeb2a3d3bb695b2b37652b64df758vboxsync m_u32ExpirationPeriod(0)
bec052941a2aeb2a3d3bb695b2b37652b64df758vboxsync {
bec052941a2aeb2a3d3bb695b2b37652b64df758vboxsync unconst(m_parentCfg)->add(this);
bec052941a2aeb2a3d3bb695b2b37652b64df758vboxsync }
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync std::string m_name;
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync const BaseConfigEntity *m_parentCfg;
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync virtual uint32_t expirationPeriod() const
051203e46846205a982bcf5ab198a8b5f6f8e6e0vboxsync {
051203e46846205a982bcf5ab198a8b5f6f8e6e0vboxsync if (!m_u32ExpirationPeriod)
051203e46846205a982bcf5ab198a8b5f6f8e6e0vboxsync return m_parentCfg->expirationPeriod();
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync else
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync return m_u32ExpirationPeriod;
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync }
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync /* XXX: private:*/
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync uint32_t m_u32ExpirationPeriod;
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync};
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync/**
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync * Network specific entries
d365a9a356e68215d7111b8f676fa04db1b88c1fvboxsync */
d365a9a356e68215d7111b8f676fa04db1b88c1fvboxsyncclass NetworkConfigEntity:public ConfigEntity
d365a9a356e68215d7111b8f676fa04db1b88c1fvboxsync{
d365a9a356e68215d7111b8f676fa04db1b88c1fvboxsync public:
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync /* Address Pool matching with network declaration */
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync NetworkConfigEntity(std::string name,
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync const BaseConfigEntity *cfg,
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync const ClientMatchCriteria *criteria,
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync int matchlvl,
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync const RTNETADDRIPV4& networkID,
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync const RTNETADDRIPV4& networkMask,
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync const RTNETADDRIPV4& lowerIP,
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync const RTNETADDRIPV4& upperIP):
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync ConfigEntity(name, cfg, criteria, matchlvl),
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync m_NetworkID(networkID),
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync m_NetworkMask(networkMask),
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync m_UpperIP(upperIP),
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync m_LowerIP(lowerIP)
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync {
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync };
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync NetworkConfigEntity(std::string name,
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync const BaseConfigEntity *cfg,
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync const ClientMatchCriteria *criteria,
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync const RTNETADDRIPV4& networkID,
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync const RTNETADDRIPV4& networkMask):
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync ConfigEntity(name, cfg, criteria, 5),
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync m_NetworkID(networkID),
bec052941a2aeb2a3d3bb695b2b37652b64df758vboxsync m_NetworkMask(networkMask)
bec052941a2aeb2a3d3bb695b2b37652b64df758vboxsync {
bec052941a2aeb2a3d3bb695b2b37652b64df758vboxsync m_UpperIP.u = m_NetworkID.u | (~m_NetworkMask.u);
bec052941a2aeb2a3d3bb695b2b37652b64df758vboxsync m_LowerIP.u = m_NetworkID.u;
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync };
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync
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
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync private:
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync RTNETADDRIPV4 m_NetworkID;
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync RTNETADDRIPV4 m_NetworkMask;
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync RTNETADDRIPV4 m_UpperIP;
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync RTNETADDRIPV4 m_LowerIP;
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync};
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync/**
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync * Host specific entry
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync * Address pool is contains one element
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync */
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsyncclass HostConfigEntity: public NetworkConfigEntity
2c38b10f3657b32c27c489ef9aede24003a64fa5vboxsync{
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync public:
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync HostConfigEntity(const RTNETADDRIPV4& addr,
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync std::string name,
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync const NetworkConfigEntity *cfg,
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync const ClientMatchCriteria *criteria):
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync NetworkConfigEntity(name,
e72d867f5d519d040e3e8a7f842e42bdc5120c5bvboxsync static_cast<const ConfigEntity*>(cfg), criteria, 10,
e72d867f5d519d040e3e8a7f842e42bdc5120c5bvboxsync cfg->networkId(), cfg->netmask(), addr, addr)
e72d867f5d519d040e3e8a7f842e42bdc5120c5bvboxsync {
bec052941a2aeb2a3d3bb695b2b37652b64df758vboxsync /* upper addr == lower addr */
bec052941a2aeb2a3d3bb695b2b37652b64df758vboxsync }
bec052941a2aeb2a3d3bb695b2b37652b64df758vboxsync
bec052941a2aeb2a3d3bb695b2b37652b64df758vboxsync virtual int match(const Client& client) const
bec052941a2aeb2a3d3bb695b2b37652b64df758vboxsync {
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync return (m_criteria->check(client) ? 10 : 0);
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync }
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync};
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsyncclass RootConfigEntity: public NetworkConfigEntity
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync{
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync public:
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync RootConfigEntity(std::string name, uint32_t expirationPeriod);
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync virtual ~RootConfigEntity(){};
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync};
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync#if 0
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync/**
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
bec052941a2aeb2a3d3bb695b2b37652b64df758vboxsync */
bec052941a2aeb2a3d3bb695b2b37652b64df758vboxsyncclass SharedNetworkConfigEntity: public NetworkEntity
bec052941a2aeb2a3d3bb695b2b37652b64df758vboxsync{
bec052941a2aeb2a3d3bb695b2b37652b64df758vboxsync public:
e579762795d321fd9390ae09c881e35c8107506fvboxsync SharedNetworkConfigEntity(){}
e579762795d321fd9390ae09c881e35c8107506fvboxsync int match(const Client& client) const { return m_criteria.match(client)? 3 : 0;}
bec052941a2aeb2a3d3bb695b2b37652b64df758vboxsync
bec052941a2aeb2a3d3bb695b2b37652b64df758vboxsync SharedNetworkConfigEntity(NetworkEntity& network)
bec052941a2aeb2a3d3bb695b2b37652b64df758vboxsync {
bec052941a2aeb2a3d3bb695b2b37652b64df758vboxsync Networks.push_back(network);
bec052941a2aeb2a3d3bb695b2b37652b64df758vboxsync }
bec052941a2aeb2a3d3bb695b2b37652b64df758vboxsync virtual ~SharedNetworkConfigEntity(){}
e579762795d321fd9390ae09c881e35c8107506fvboxsync
e579762795d321fd9390ae09c881e35c8107506fvboxsync std::vector<NetworkConfigEntity> Networks;
e579762795d321fd9390ae09c881e35c8107506fvboxsync
bec052941a2aeb2a3d3bb695b2b37652b64df758vboxsync};
bec052941a2aeb2a3d3bb695b2b37652b64df758vboxsync#endif
bec052941a2aeb2a3d3bb695b2b37652b64df758vboxsync
bec052941a2aeb2a3d3bb695b2b37652b64df758vboxsyncclass ConfigurationManager
bec052941a2aeb2a3d3bb695b2b37652b64df758vboxsync{
bec052941a2aeb2a3d3bb695b2b37652b64df758vboxsync public:
bec052941a2aeb2a3d3bb695b2b37652b64df758vboxsync static ConfigurationManager* getConfigurationManager();
e579762795d321fd9390ae09c881e35c8107506fvboxsync static int extractRequestList(PCRTNETBOOTP pDhcpMsg, size_t cbDhcpMsg, RawOption& rawOpt);
e579762795d321fd9390ae09c881e35c8107506fvboxsync
e579762795d321fd9390ae09c881e35c8107506fvboxsync /**
e579762795d321fd9390ae09c881e35c8107506fvboxsync *
75d67a5757951aa64bf3887a70db379e1feb84aavboxsync */
75d67a5757951aa64bf3887a70db379e1feb84aavboxsync Client* getClientByDhcpPacket(const RTNETBOOTP *pDhcpMsg, size_t cbDhcpMsg);
75d67a5757951aa64bf3887a70db379e1feb84aavboxsync
e579762795d321fd9390ae09c881e35c8107506fvboxsync /**
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 */
bec052941a2aeb2a3d3bb695b2b37652b64df758vboxsync Lease* allocateLease4Client(Client *client, PCRTNETBOOTP pDhcpMsg, size_t cbDhcpMsg);
bec052941a2aeb2a3d3bb695b2b37652b64df758vboxsync
bec052941a2aeb2a3d3bb695b2b37652b64df758vboxsync /**
bec052941a2aeb2a3d3bb695b2b37652b64df758vboxsync * We call this before DHCPACK sent and after DHCPREQUEST received ...
bec052941a2aeb2a3d3bb695b2b37652b64df758vboxsync * when requested configuration is acceptable.
bec052941a2aeb2a3d3bb695b2b37652b64df758vboxsync */
e579762795d321fd9390ae09c881e35c8107506fvboxsync int commitLease4Client(Client *client);
e579762795d321fd9390ae09c881e35c8107506fvboxsync
e579762795d321fd9390ae09c881e35c8107506fvboxsync /**
bec052941a2aeb2a3d3bb695b2b37652b64df758vboxsync * Expires client lease.
bec052941a2aeb2a3d3bb695b2b37652b64df758vboxsync */
e579762795d321fd9390ae09c881e35c8107506fvboxsync int expireLease4Client(Client *client);
e579762795d321fd9390ae09c881e35c8107506fvboxsync
e579762795d321fd9390ae09c881e35c8107506fvboxsync static int findOption(uint8_t uOption, PCRTNETBOOTP pDhcpMsg, size_t cbDhcpMsg, RawOption& opt);
bec052941a2aeb2a3d3bb695b2b37652b64df758vboxsync
bec052941a2aeb2a3d3bb695b2b37652b64df758vboxsync NetworkConfigEntity *addNetwork(NetworkConfigEntity *pCfg,
bec052941a2aeb2a3d3bb695b2b37652b64df758vboxsync const RTNETADDRIPV4& networkId,
e579762795d321fd9390ae09c881e35c8107506fvboxsync const RTNETADDRIPV4& netmask,
e579762795d321fd9390ae09c881e35c8107506fvboxsync RTNETADDRIPV4& UpperAddress,
e579762795d321fd9390ae09c881e35c8107506fvboxsync RTNETADDRIPV4& LowerAddress);
e579762795d321fd9390ae09c881e35c8107506fvboxsync
bec052941a2aeb2a3d3bb695b2b37652b64df758vboxsync HostConfigEntity *addHost(NetworkConfigEntity*, const RTNETADDRIPV4&, ClientMatchCriteria*);
bec052941a2aeb2a3d3bb695b2b37652b64df758vboxsync int addToAddressList(uint8_t u8OptId, RTNETADDRIPV4& address);
bec052941a2aeb2a3d3bb695b2b37652b64df758vboxsync int flushAddressList(uint8_t u8OptId);
bec052941a2aeb2a3d3bb695b2b37652b64df758vboxsync int setString(uint8_t u8OptId, const std::string& str);
e579762795d321fd9390ae09c881e35c8107506fvboxsync const std::string& getString(uint8_t u8OptId);
e579762795d321fd9390ae09c881e35c8107506fvboxsync const Ipv4AddressContainer& getAddressList(uint8_t u8OptId);
e579762795d321fd9390ae09c881e35c8107506fvboxsync
e579762795d321fd9390ae09c881e35c8107506fvboxsyncprivate:
bec052941a2aeb2a3d3bb695b2b37652b64df758vboxsync ConfigurationManager(){}
bec052941a2aeb2a3d3bb695b2b37652b64df758vboxsync virtual ~ConfigurationManager(){}
bec052941a2aeb2a3d3bb695b2b37652b64df758vboxsync bool isAddressTaken(const RTNETADDRIPV4& addr, Lease** ppLease = NULL);
bec052941a2aeb2a3d3bb695b2b37652b64df758vboxsync
bec052941a2aeb2a3d3bb695b2b37652b64df758vboxsyncpublic:
bec052941a2aeb2a3d3bb695b2b37652b64df758vboxsync /* nulls */
e579762795d321fd9390ae09c881e35c8107506fvboxsync const Ipv4AddressContainer m_empty;
d365a9a356e68215d7111b8f676fa04db1b88c1fvboxsync const std::string m_noString;
d365a9a356e68215d7111b8f676fa04db1b88c1fvboxsync
d365a9a356e68215d7111b8f676fa04db1b88c1fvboxsyncprivate:
d365a9a356e68215d7111b8f676fa04db1b88c1fvboxsync MapLease2Ip4Address m_allocations;
061168b301e15895799842f766644c211b8701c9vboxsync /**
d365a9a356e68215d7111b8f676fa04db1b88c1fvboxsync * Here we can store expired Leases to do not re-allocate them latter.
d365a9a356e68215d7111b8f676fa04db1b88c1fvboxsync */
d365a9a356e68215d7111b8f676fa04db1b88c1fvboxsync
d365a9a356e68215d7111b8f676fa04db1b88c1fvboxsync /* XXX: MapLease2Ip4Address m_freed; */
d365a9a356e68215d7111b8f676fa04db1b88c1fvboxsync /* XXX: more universal storages are required. */
d365a9a356e68215d7111b8f676fa04db1b88c1fvboxsync Ipv4AddressContainer m_nameservers;
d365a9a356e68215d7111b8f676fa04db1b88c1fvboxsync Ipv4AddressContainer m_routers;
d365a9a356e68215d7111b8f676fa04db1b88c1fvboxsync
d365a9a356e68215d7111b8f676fa04db1b88c1fvboxsync std::string m_domainName;
d365a9a356e68215d7111b8f676fa04db1b88c1fvboxsync VecClient m_clients;
d365a9a356e68215d7111b8f676fa04db1b88c1fvboxsync};
d365a9a356e68215d7111b8f676fa04db1b88c1fvboxsync
061168b301e15895799842f766644c211b8701c9vboxsync
d365a9a356e68215d7111b8f676fa04db1b88c1fvboxsyncclass NetworkManager
d365a9a356e68215d7111b8f676fa04db1b88c1fvboxsync{
d365a9a356e68215d7111b8f676fa04db1b88c1fvboxsync public:
d365a9a356e68215d7111b8f676fa04db1b88c1fvboxsync static NetworkManager *getNetworkManager();
d365a9a356e68215d7111b8f676fa04db1b88c1fvboxsync
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 int nak(Client *lease, uint32_t u32Xid);
d365a9a356e68215d7111b8f676fa04db1b88c1fvboxsync
d365a9a356e68215d7111b8f676fa04db1b88c1fvboxsync const RTNETADDRIPV4& getOurAddress(){ return m_OurAddress;}
d365a9a356e68215d7111b8f676fa04db1b88c1fvboxsync const RTNETADDRIPV4& getOurNetmask(){ return m_OurNetmask;}
d365a9a356e68215d7111b8f676fa04db1b88c1fvboxsync const RTMAC& getOurMac() {return m_OurMac;}
d365a9a356e68215d7111b8f676fa04db1b88c1fvboxsync
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
d365a9a356e68215d7111b8f676fa04db1b88c1fvboxsync /* XXX: artifacts should be hidden or removed from here. */
d365a9a356e68215d7111b8f676fa04db1b88c1fvboxsync PSUPDRVSESSION m_pSession;
d365a9a356e68215d7111b8f676fa04db1b88c1fvboxsync INTNETIFHANDLE m_hIf;
d365a9a356e68215d7111b8f676fa04db1b88c1fvboxsync PINTNETBUF m_pIfBuf;
d365a9a356e68215d7111b8f676fa04db1b88c1fvboxsync
d365a9a356e68215d7111b8f676fa04db1b88c1fvboxsync private:
d365a9a356e68215d7111b8f676fa04db1b88c1fvboxsync int prepareReplyPacket4Client(Client *client, uint32_t u32Xid);
d365a9a356e68215d7111b8f676fa04db1b88c1fvboxsync int doReply(Client *client);
d365a9a356e68215d7111b8f676fa04db1b88c1fvboxsync int processParameterReqList(Client *client, uint8_t *pu8ReqList, int cReqList);
d365a9a356e68215d7111b8f676fa04db1b88c1fvboxsync
d365a9a356e68215d7111b8f676fa04db1b88c1fvboxsync union {
d365a9a356e68215d7111b8f676fa04db1b88c1fvboxsync RTNETBOOTP BootPHeader;
d365a9a356e68215d7111b8f676fa04db1b88c1fvboxsync uint8_t au8Storage[1024];
d365a9a356e68215d7111b8f676fa04db1b88c1fvboxsync } BootPReplyMsg;
061168b301e15895799842f766644c211b8701c9vboxsync int cbBooPReplyMsg;
d365a9a356e68215d7111b8f676fa04db1b88c1fvboxsync
061168b301e15895799842f766644c211b8701c9vboxsync RTNETADDRIPV4 m_OurAddress;
061168b301e15895799842f766644c211b8701c9vboxsync RTNETADDRIPV4 m_OurNetmask;
061168b301e15895799842f766644c211b8701c9vboxsync RTMAC m_OurMac;
061168b301e15895799842f766644c211b8701c9vboxsync
061168b301e15895799842f766644c211b8701c9vboxsync NetworkManager(){}
061168b301e15895799842f766644c211b8701c9vboxsync virtual ~NetworkManager(){}
061168b301e15895799842f766644c211b8701c9vboxsync};
061168b301e15895799842f766644c211b8701c9vboxsync
d365a9a356e68215d7111b8f676fa04db1b88c1fvboxsync
d365a9a356e68215d7111b8f676fa04db1b88c1fvboxsync
d365a9a356e68215d7111b8f676fa04db1b88c1fvboxsyncclass Lease
d365a9a356e68215d7111b8f676fa04db1b88c1fvboxsync{
d365a9a356e68215d7111b8f676fa04db1b88c1fvboxsyncpublic:
d365a9a356e68215d7111b8f676fa04db1b88c1fvboxsync Lease()
d365a9a356e68215d7111b8f676fa04db1b88c1fvboxsync {
d365a9a356e68215d7111b8f676fa04db1b88c1fvboxsync m_address.u = 0;
d365a9a356e68215d7111b8f676fa04db1b88c1fvboxsync m_client = NULL;
d365a9a356e68215d7111b8f676fa04db1b88c1fvboxsync fBinding = false;
d365a9a356e68215d7111b8f676fa04db1b88c1fvboxsync u64TimestampBindingStarted = 0;
d365a9a356e68215d7111b8f676fa04db1b88c1fvboxsync u64TimestampLeasingStarted = 0;
d365a9a356e68215d7111b8f676fa04db1b88c1fvboxsync u32LeaseExpirationPeriod = 0;
d365a9a356e68215d7111b8f676fa04db1b88c1fvboxsync u32BindExpirationPeriod = 0;
d365a9a356e68215d7111b8f676fa04db1b88c1fvboxsync pCfg = NULL;
d365a9a356e68215d7111b8f676fa04db1b88c1fvboxsync }
d365a9a356e68215d7111b8f676fa04db1b88c1fvboxsync virtual ~Lease(){}
d365a9a356e68215d7111b8f676fa04db1b88c1fvboxsync
d365a9a356e68215d7111b8f676fa04db1b88c1fvboxsync bool isExpired()
d365a9a356e68215d7111b8f676fa04db1b88c1fvboxsync {
d365a9a356e68215d7111b8f676fa04db1b88c1fvboxsync if (!fBinding)
d365a9a356e68215d7111b8f676fa04db1b88c1fvboxsync return (ASMDivU64ByU32RetU32(RTTimeMilliTS() - u64TimestampLeasingStarted, 1000)
d365a9a356e68215d7111b8f676fa04db1b88c1fvboxsync > u32LeaseExpirationPeriod);
d365a9a356e68215d7111b8f676fa04db1b88c1fvboxsync else
d365a9a356e68215d7111b8f676fa04db1b88c1fvboxsync return (ASMDivU64ByU32RetU32(RTTimeMilliTS() - u64TimestampBindingStarted, 1000)
d365a9a356e68215d7111b8f676fa04db1b88c1fvboxsync > u32BindExpirationPeriod);
d365a9a356e68215d7111b8f676fa04db1b88c1fvboxsync
d365a9a356e68215d7111b8f676fa04db1b88c1fvboxsync }
d365a9a356e68215d7111b8f676fa04db1b88c1fvboxsync
d365a9a356e68215d7111b8f676fa04db1b88c1fvboxsync /* XXX private: */
d365a9a356e68215d7111b8f676fa04db1b88c1fvboxsync RTNETADDRIPV4 m_address;
d365a9a356e68215d7111b8f676fa04db1b88c1fvboxsync
d365a9a356e68215d7111b8f676fa04db1b88c1fvboxsync /** lease isn't commited */
d365a9a356e68215d7111b8f676fa04db1b88c1fvboxsync bool fBinding;
d365a9a356e68215d7111b8f676fa04db1b88c1fvboxsync
d365a9a356e68215d7111b8f676fa04db1b88c1fvboxsync /** Timestamp when lease commited. */
d365a9a356e68215d7111b8f676fa04db1b88c1fvboxsync uint64_t u64TimestampLeasingStarted;
d365a9a356e68215d7111b8f676fa04db1b88c1fvboxsync /** Period when lease is expired in secs. */
d365a9a356e68215d7111b8f676fa04db1b88c1fvboxsync uint32_t u32LeaseExpirationPeriod;
d365a9a356e68215d7111b8f676fa04db1b88c1fvboxsync
d365a9a356e68215d7111b8f676fa04db1b88c1fvboxsync /** timestamp when lease was bound */
d365a9a356e68215d7111b8f676fa04db1b88c1fvboxsync uint64_t u64TimestampBindingStarted;
d365a9a356e68215d7111b8f676fa04db1b88c1fvboxsync /* Period when binding is expired in secs. */
d365a9a356e68215d7111b8f676fa04db1b88c1fvboxsync uint32_t u32BindExpirationPeriod;
d365a9a356e68215d7111b8f676fa04db1b88c1fvboxsync
d365a9a356e68215d7111b8f676fa04db1b88c1fvboxsync NetworkConfigEntity *pCfg;
d365a9a356e68215d7111b8f676fa04db1b88c1fvboxsync Client *m_client;
d365a9a356e68215d7111b8f676fa04db1b88c1fvboxsync};
d365a9a356e68215d7111b8f676fa04db1b88c1fvboxsync
d365a9a356e68215d7111b8f676fa04db1b88c1fvboxsync
d365a9a356e68215d7111b8f676fa04db1b88c1fvboxsync
d365a9a356e68215d7111b8f676fa04db1b88c1fvboxsync
d365a9a356e68215d7111b8f676fa04db1b88c1fvboxsync
d365a9a356e68215d7111b8f676fa04db1b88c1fvboxsyncextern const ClientMatchCriteria *g_AnyClient;
d365a9a356e68215d7111b8f676fa04db1b88c1fvboxsyncextern RootConfigEntity *g_RootConfig;
d365a9a356e68215d7111b8f676fa04db1b88c1fvboxsyncextern const NullConfigEntity *g_NullConfig;
d365a9a356e68215d7111b8f676fa04db1b88c1fvboxsync
d365a9a356e68215d7111b8f676fa04db1b88c1fvboxsync/**
d365a9a356e68215d7111b8f676fa04db1b88c1fvboxsync * Helper class for stuffing DHCP options into a reply packet.
d365a9a356e68215d7111b8f676fa04db1b88c1fvboxsync */
d365a9a356e68215d7111b8f676fa04db1b88c1fvboxsyncclass VBoxNetDhcpWriteCursor
d365a9a356e68215d7111b8f676fa04db1b88c1fvboxsync{
d365a9a356e68215d7111b8f676fa04db1b88c1fvboxsyncprivate:
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 PRTNETDHCPOPT m_pOpt; /**< The current option. */
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync PRTNETBOOTP m_pDhcp; /**< The DHCP packet. */
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync bool m_fOverflowed; /**< Set if we've overflowed, otherwise false. */
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsyncpublic:
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync /** Instantiate an option cursor for the specified DHCP message. */
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync VBoxNetDhcpWriteCursor(PRTNETBOOTP pDhcp, size_t cbDhcp) :
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync m_pbCur(&pDhcp->bp_vend.Dhcp.dhcp_opts[0]),
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync m_pbEnd((uint8_t *)pDhcp + cbDhcp),
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync m_pfOverload(NULL),
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync m_fUsed(0),
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync m_pOpt(NULL),
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync m_pDhcp(pDhcp),
051203e46846205a982bcf5ab198a8b5f6f8e6e0vboxsync m_fOverflowed(false)
051203e46846205a982bcf5ab198a8b5f6f8e6e0vboxsync {
051203e46846205a982bcf5ab198a8b5f6f8e6e0vboxsync AssertPtr(pDhcp);
051203e46846205a982bcf5ab198a8b5f6f8e6e0vboxsync Assert(cbDhcp > RT_UOFFSETOF(RTNETBOOTP, bp_vend.Dhcp.dhcp_opts[10]));
051203e46846205a982bcf5ab198a8b5f6f8e6e0vboxsync }
051203e46846205a982bcf5ab198a8b5f6f8e6e0vboxsync
051203e46846205a982bcf5ab198a8b5f6f8e6e0vboxsync /** Destructor. */
051203e46846205a982bcf5ab198a8b5f6f8e6e0vboxsync ~VBoxNetDhcpWriteCursor()
051203e46846205a982bcf5ab198a8b5f6f8e6e0vboxsync {
051203e46846205a982bcf5ab198a8b5f6f8e6e0vboxsync m_pbCur = m_pbEnd = m_pfOverload = NULL;
051203e46846205a982bcf5ab198a8b5f6f8e6e0vboxsync m_pOpt = NULL;
051203e46846205a982bcf5ab198a8b5f6f8e6e0vboxsync m_pDhcp = NULL;
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync }
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync /**
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync * Try use the bp_file field.
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync * @returns true if not overloaded, false otherwise.
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync */
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync bool useBpFile(void)
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync {
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync if ( m_pfOverload
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync && (*m_pfOverload & 1))
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync return false;
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync m_fUsed |= 1 /* bp_file flag*/;
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync return true;
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync }
051203e46846205a982bcf5ab198a8b5f6f8e6e0vboxsync
051203e46846205a982bcf5ab198a8b5f6f8e6e0vboxsync
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync /**
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync * Try overload more BOOTP fields
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync */
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync bool overloadMore(void)
4c303299e657f3cfd3c6db618e443b93e5b814a2vboxsync {
4c303299e657f3cfd3c6db618e443b93e5b814a2vboxsync /* switch option area. */
4c303299e657f3cfd3c6db618e443b93e5b814a2vboxsync uint8_t *pbNew;
bec052941a2aeb2a3d3bb695b2b37652b64df758vboxsync uint8_t *pbNewEnd;
bec052941a2aeb2a3d3bb695b2b37652b64df758vboxsync uint8_t fField;
bec052941a2aeb2a3d3bb695b2b37652b64df758vboxsync if (!(m_fUsed & 1))
bec052941a2aeb2a3d3bb695b2b37652b64df758vboxsync {
bec052941a2aeb2a3d3bb695b2b37652b64df758vboxsync fField = 1;
bec052941a2aeb2a3d3bb695b2b37652b64df758vboxsync pbNew = &m_pDhcp->bp_file[0];
bec052941a2aeb2a3d3bb695b2b37652b64df758vboxsync pbNewEnd = &m_pDhcp->bp_file[sizeof(m_pDhcp->bp_file)];
bec052941a2aeb2a3d3bb695b2b37652b64df758vboxsync }
bec052941a2aeb2a3d3bb695b2b37652b64df758vboxsync else if (!(m_fUsed & 2))
bec052941a2aeb2a3d3bb695b2b37652b64df758vboxsync {
bec052941a2aeb2a3d3bb695b2b37652b64df758vboxsync fField = 2;
bec052941a2aeb2a3d3bb695b2b37652b64df758vboxsync pbNew = &m_pDhcp->bp_sname[0];
bec052941a2aeb2a3d3bb695b2b37652b64df758vboxsync pbNewEnd = &m_pDhcp->bp_sname[sizeof(m_pDhcp->bp_sname)];
bec052941a2aeb2a3d3bb695b2b37652b64df758vboxsync }
bec052941a2aeb2a3d3bb695b2b37652b64df758vboxsync else
bec052941a2aeb2a3d3bb695b2b37652b64df758vboxsync return false;
bec052941a2aeb2a3d3bb695b2b37652b64df758vboxsync
bec052941a2aeb2a3d3bb695b2b37652b64df758vboxsync if (!m_pfOverload)
bec052941a2aeb2a3d3bb695b2b37652b64df758vboxsync {
bec052941a2aeb2a3d3bb695b2b37652b64df758vboxsync /* Add an overload option. */
bec052941a2aeb2a3d3bb695b2b37652b64df758vboxsync *m_pbCur++ = RTNET_DHCP_OPT_OPTION_OVERLOAD;
bec052941a2aeb2a3d3bb695b2b37652b64df758vboxsync *m_pbCur++ = fField;
bec052941a2aeb2a3d3bb695b2b37652b64df758vboxsync m_pfOverload = m_pbCur;
bec052941a2aeb2a3d3bb695b2b37652b64df758vboxsync *m_pbCur++ = 1; /* bp_file flag */
bec052941a2aeb2a3d3bb695b2b37652b64df758vboxsync }
bec052941a2aeb2a3d3bb695b2b37652b64df758vboxsync else
bec052941a2aeb2a3d3bb695b2b37652b64df758vboxsync *m_pfOverload |= fField;
4c303299e657f3cfd3c6db618e443b93e5b814a2vboxsync
bec052941a2aeb2a3d3bb695b2b37652b64df758vboxsync /* pad current option field */
bec052941a2aeb2a3d3bb695b2b37652b64df758vboxsync while (m_pbCur != m_pbEnd)
4c303299e657f3cfd3c6db618e443b93e5b814a2vboxsync *m_pbCur++ = RTNET_DHCP_OPT_PAD; /** @todo not sure if this stuff is at all correct... */
bec052941a2aeb2a3d3bb695b2b37652b64df758vboxsync
bec052941a2aeb2a3d3bb695b2b37652b64df758vboxsync /* switch */
bec052941a2aeb2a3d3bb695b2b37652b64df758vboxsync m_pbCur = pbNew;
bec052941a2aeb2a3d3bb695b2b37652b64df758vboxsync m_pbEnd = pbNewEnd;
4c303299e657f3cfd3c6db618e443b93e5b814a2vboxsync return true;
bec052941a2aeb2a3d3bb695b2b37652b64df758vboxsync }
bec052941a2aeb2a3d3bb695b2b37652b64df758vboxsync
bec052941a2aeb2a3d3bb695b2b37652b64df758vboxsync /**
bec052941a2aeb2a3d3bb695b2b37652b64df758vboxsync * Begin an option.
bec052941a2aeb2a3d3bb695b2b37652b64df758vboxsync *
4c303299e657f3cfd3c6db618e443b93e5b814a2vboxsync * @returns true on success, false if we're out of space.
bec052941a2aeb2a3d3bb695b2b37652b64df758vboxsync *
75d67a5757951aa64bf3887a70db379e1feb84aavboxsync * @param uOption The option number.
bec052941a2aeb2a3d3bb695b2b37652b64df758vboxsync * @param cb The amount of data.
4c303299e657f3cfd3c6db618e443b93e5b814a2vboxsync */
bec052941a2aeb2a3d3bb695b2b37652b64df758vboxsync bool begin(uint8_t uOption, size_t cb)
75d67a5757951aa64bf3887a70db379e1feb84aavboxsync {
bec052941a2aeb2a3d3bb695b2b37652b64df758vboxsync /* Check that the data of the previous option has all been written. */
4c303299e657f3cfd3c6db618e443b93e5b814a2vboxsync Assert( !m_pOpt
bec052941a2aeb2a3d3bb695b2b37652b64df758vboxsync || (m_pbCur - m_pOpt->dhcp_len == (uint8_t *)(m_pOpt + 1)));
bec052941a2aeb2a3d3bb695b2b37652b64df758vboxsync AssertMsg(cb <= 255, ("%#x\n", cb));
bec052941a2aeb2a3d3bb695b2b37652b64df758vboxsync
bec052941a2aeb2a3d3bb695b2b37652b64df758vboxsync /* Check if we need to overload more stuff. */
bec052941a2aeb2a3d3bb695b2b37652b64df758vboxsync if ((uintptr_t)(m_pbEnd - m_pbCur) < cb + 2 + (m_pfOverload ? 1 : 3))
bec052941a2aeb2a3d3bb695b2b37652b64df758vboxsync {
bec052941a2aeb2a3d3bb695b2b37652b64df758vboxsync m_pOpt = NULL;
bec052941a2aeb2a3d3bb695b2b37652b64df758vboxsync if (!overloadMore())
bec052941a2aeb2a3d3bb695b2b37652b64df758vboxsync {
bec052941a2aeb2a3d3bb695b2b37652b64df758vboxsync m_fOverflowed = true;
bec052941a2aeb2a3d3bb695b2b37652b64df758vboxsync AssertMsgFailedReturn(("%u %#x\n", uOption, cb), false);
bec052941a2aeb2a3d3bb695b2b37652b64df758vboxsync }
bec052941a2aeb2a3d3bb695b2b37652b64df758vboxsync if ((uintptr_t)(m_pbEnd - m_pbCur) < cb + 2 + 1)
bec052941a2aeb2a3d3bb695b2b37652b64df758vboxsync {
bec052941a2aeb2a3d3bb695b2b37652b64df758vboxsync m_fOverflowed = true;
bec052941a2aeb2a3d3bb695b2b37652b64df758vboxsync AssertMsgFailedReturn(("%u %#x\n", uOption, cb), false);
bec052941a2aeb2a3d3bb695b2b37652b64df758vboxsync }
bec052941a2aeb2a3d3bb695b2b37652b64df758vboxsync }
bec052941a2aeb2a3d3bb695b2b37652b64df758vboxsync
bec052941a2aeb2a3d3bb695b2b37652b64df758vboxsync /* Emit the option header. */
bec052941a2aeb2a3d3bb695b2b37652b64df758vboxsync m_pOpt = (PRTNETDHCPOPT)m_pbCur;
bec052941a2aeb2a3d3bb695b2b37652b64df758vboxsync m_pOpt->dhcp_opt = uOption;
bec052941a2aeb2a3d3bb695b2b37652b64df758vboxsync m_pOpt->dhcp_len = (uint8_t)cb;
bec052941a2aeb2a3d3bb695b2b37652b64df758vboxsync m_pbCur += 2;
bec052941a2aeb2a3d3bb695b2b37652b64df758vboxsync return true;
bec052941a2aeb2a3d3bb695b2b37652b64df758vboxsync }
bec052941a2aeb2a3d3bb695b2b37652b64df758vboxsync
bec052941a2aeb2a3d3bb695b2b37652b64df758vboxsync /**
bec052941a2aeb2a3d3bb695b2b37652b64df758vboxsync * Puts option data.
bec052941a2aeb2a3d3bb695b2b37652b64df758vboxsync *
bec052941a2aeb2a3d3bb695b2b37652b64df758vboxsync * @param pvData The data.
bec052941a2aeb2a3d3bb695b2b37652b64df758vboxsync * @param cb The amount to put.
bec052941a2aeb2a3d3bb695b2b37652b64df758vboxsync */
bec052941a2aeb2a3d3bb695b2b37652b64df758vboxsync void put(void const *pvData, size_t cb)
bec052941a2aeb2a3d3bb695b2b37652b64df758vboxsync {
bec052941a2aeb2a3d3bb695b2b37652b64df758vboxsync Assert(m_pOpt || m_fOverflowed);
bec052941a2aeb2a3d3bb695b2b37652b64df758vboxsync if (RT_LIKELY(m_pOpt))
bec052941a2aeb2a3d3bb695b2b37652b64df758vboxsync {
bec052941a2aeb2a3d3bb695b2b37652b64df758vboxsync Assert((uintptr_t)m_pbCur - (uintptr_t)(m_pOpt + 1) + cb <= (size_t)m_pOpt->dhcp_len);
bec052941a2aeb2a3d3bb695b2b37652b64df758vboxsync memcpy(m_pbCur, pvData, cb);
bec052941a2aeb2a3d3bb695b2b37652b64df758vboxsync m_pbCur += cb;
bec052941a2aeb2a3d3bb695b2b37652b64df758vboxsync }
bec052941a2aeb2a3d3bb695b2b37652b64df758vboxsync }
bec052941a2aeb2a3d3bb695b2b37652b64df758vboxsync
4c303299e657f3cfd3c6db618e443b93e5b814a2vboxsync /**
4c303299e657f3cfd3c6db618e443b93e5b814a2vboxsync * Puts an IPv4 Address.
4c303299e657f3cfd3c6db618e443b93e5b814a2vboxsync *
4c303299e657f3cfd3c6db618e443b93e5b814a2vboxsync * @param IPv4Addr The address.
4c303299e657f3cfd3c6db618e443b93e5b814a2vboxsync */
4c303299e657f3cfd3c6db618e443b93e5b814a2vboxsync void putIPv4Addr(RTNETADDRIPV4 IPv4Addr)
4c303299e657f3cfd3c6db618e443b93e5b814a2vboxsync {
4c303299e657f3cfd3c6db618e443b93e5b814a2vboxsync put(&IPv4Addr, 4);
4c303299e657f3cfd3c6db618e443b93e5b814a2vboxsync }
4c303299e657f3cfd3c6db618e443b93e5b814a2vboxsync
4c303299e657f3cfd3c6db618e443b93e5b814a2vboxsync /**
4c303299e657f3cfd3c6db618e443b93e5b814a2vboxsync * Adds an IPv4 address option.
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync *
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync * @returns true/false just like begin().
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync *
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync * @param uOption The option number.
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync * @param IPv4Addr The address.
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync */
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync bool optIPv4Addr(uint8_t uOption, RTNETADDRIPV4 IPv4Addr)
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync {
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync if (!begin(uOption, 4))
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync return false;
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync putIPv4Addr(IPv4Addr);
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync return true;
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync }
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync /**
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync * Adds an option taking 1 or more IPv4 address.
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync *
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync * If the vector contains no addresses, the option will not be added.
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync *
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync * @returns true/false just like begin().
dbabcd810984fc0731edff08eb281f0907dc867avboxsync *
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync * @param uOption The option number.
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync * @param rIPv4Addrs Reference to the address vector.
dbabcd810984fc0731edff08eb281f0907dc867avboxsync */
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync bool optIPv4Addrs(uint8_t uOption, std::vector<RTNETADDRIPV4> const &rIPv4Addrs)
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync {
dbabcd810984fc0731edff08eb281f0907dc867avboxsync size_t const c = rIPv4Addrs.size();
051203e46846205a982bcf5ab198a8b5f6f8e6e0vboxsync if (!c)
051203e46846205a982bcf5ab198a8b5f6f8e6e0vboxsync return true;
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync if (!begin(uOption, 4*c))
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync return false;
dbabcd810984fc0731edff08eb281f0907dc867avboxsync for (size_t i = 0; i < c; i++)
dbabcd810984fc0731edff08eb281f0907dc867avboxsync putIPv4Addr(rIPv4Addrs[i]);
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync return true;
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync }
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync /**
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync * Puts an 8-bit integer.
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync *
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync * @param u8 The integer.
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync */
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync void putU8(uint8_t u8)
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync {
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync put(&u8, 1);
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync }
febf3f1de573e25fb134b8453a22b0732b4c52e2vboxsync
4c7080424765b6ab6900953b3736e857318a6126vboxsync /**
4c7080424765b6ab6900953b3736e857318a6126vboxsync * Adds an 8-bit integer option.
4c7080424765b6ab6900953b3736e857318a6126vboxsync *
bec052941a2aeb2a3d3bb695b2b37652b64df758vboxsync * @returns true/false just like begin().
bec052941a2aeb2a3d3bb695b2b37652b64df758vboxsync *
bec052941a2aeb2a3d3bb695b2b37652b64df758vboxsync * @param uOption The option number.
bec052941a2aeb2a3d3bb695b2b37652b64df758vboxsync * @param u8 The integer
bec052941a2aeb2a3d3bb695b2b37652b64df758vboxsync */
bec052941a2aeb2a3d3bb695b2b37652b64df758vboxsync bool optU8(uint8_t uOption, uint8_t u8)
e579762795d321fd9390ae09c881e35c8107506fvboxsync {
bec052941a2aeb2a3d3bb695b2b37652b64df758vboxsync if (!begin(uOption, 1))
bec052941a2aeb2a3d3bb695b2b37652b64df758vboxsync return false;
d6a533c77fa274df5ee0e592c6abfa73549f2b34vboxsync putU8(u8);
d6a533c77fa274df5ee0e592c6abfa73549f2b34vboxsync return true;
bec052941a2aeb2a3d3bb695b2b37652b64df758vboxsync }
bec052941a2aeb2a3d3bb695b2b37652b64df758vboxsync
bec052941a2aeb2a3d3bb695b2b37652b64df758vboxsync /**
bec052941a2aeb2a3d3bb695b2b37652b64df758vboxsync * Puts an 32-bit integer (network endian).
bec052941a2aeb2a3d3bb695b2b37652b64df758vboxsync *
bec052941a2aeb2a3d3bb695b2b37652b64df758vboxsync * @param u32Network The integer.
bec052941a2aeb2a3d3bb695b2b37652b64df758vboxsync */
bec052941a2aeb2a3d3bb695b2b37652b64df758vboxsync void putU32(uint32_t u32)
bec052941a2aeb2a3d3bb695b2b37652b64df758vboxsync {
bec052941a2aeb2a3d3bb695b2b37652b64df758vboxsync put(&u32, 4);
bec052941a2aeb2a3d3bb695b2b37652b64df758vboxsync }
bec052941a2aeb2a3d3bb695b2b37652b64df758vboxsync
bec052941a2aeb2a3d3bb695b2b37652b64df758vboxsync /**
bec052941a2aeb2a3d3bb695b2b37652b64df758vboxsync * Adds an 32-bit integer (network endian) option.
bec052941a2aeb2a3d3bb695b2b37652b64df758vboxsync *
bec052941a2aeb2a3d3bb695b2b37652b64df758vboxsync * @returns true/false just like begin().
bec052941a2aeb2a3d3bb695b2b37652b64df758vboxsync *
bec052941a2aeb2a3d3bb695b2b37652b64df758vboxsync * @param uOption The option number.
bec052941a2aeb2a3d3bb695b2b37652b64df758vboxsync * @param u32Network The integer.
bec052941a2aeb2a3d3bb695b2b37652b64df758vboxsync */
bec052941a2aeb2a3d3bb695b2b37652b64df758vboxsync bool optU32(uint8_t uOption, uint32_t u32)
bec052941a2aeb2a3d3bb695b2b37652b64df758vboxsync {
bec052941a2aeb2a3d3bb695b2b37652b64df758vboxsync if (!begin(uOption, 4))
bec052941a2aeb2a3d3bb695b2b37652b64df758vboxsync return false;
bec052941a2aeb2a3d3bb695b2b37652b64df758vboxsync putU32(u32);
bec052941a2aeb2a3d3bb695b2b37652b64df758vboxsync return true;
bec052941a2aeb2a3d3bb695b2b37652b64df758vboxsync }
bec052941a2aeb2a3d3bb695b2b37652b64df758vboxsync
bec052941a2aeb2a3d3bb695b2b37652b64df758vboxsync /**
bec052941a2aeb2a3d3bb695b2b37652b64df758vboxsync * Puts a std::string.
bec052941a2aeb2a3d3bb695b2b37652b64df758vboxsync *
bec052941a2aeb2a3d3bb695b2b37652b64df758vboxsync * @param rStr Reference to the string.
4c7080424765b6ab6900953b3736e857318a6126vboxsync */
d6a533c77fa274df5ee0e592c6abfa73549f2b34vboxsync void putStr(std::string const &rStr)
4c7080424765b6ab6900953b3736e857318a6126vboxsync {
bec052941a2aeb2a3d3bb695b2b37652b64df758vboxsync put(rStr.c_str(), rStr.size());
4c7080424765b6ab6900953b3736e857318a6126vboxsync }
d6a533c77fa274df5ee0e592c6abfa73549f2b34vboxsync
4c7080424765b6ab6900953b3736e857318a6126vboxsync /**
bec052941a2aeb2a3d3bb695b2b37652b64df758vboxsync * Adds an std::string option if the string isn't empty.
4c7080424765b6ab6900953b3736e857318a6126vboxsync *
d6a533c77fa274df5ee0e592c6abfa73549f2b34vboxsync * @returns true/false just like begin().
4c7080424765b6ab6900953b3736e857318a6126vboxsync *
bec052941a2aeb2a3d3bb695b2b37652b64df758vboxsync * @param uOption The option number.
4c7080424765b6ab6900953b3736e857318a6126vboxsync * @param rStr Reference to the string.
bec052941a2aeb2a3d3bb695b2b37652b64df758vboxsync */
bec052941a2aeb2a3d3bb695b2b37652b64df758vboxsync bool optStr(uint8_t uOption, std::string const &rStr)
4c7080424765b6ab6900953b3736e857318a6126vboxsync {
bec052941a2aeb2a3d3bb695b2b37652b64df758vboxsync const size_t cch = rStr.size();
4c7080424765b6ab6900953b3736e857318a6126vboxsync if (!cch)
bec052941a2aeb2a3d3bb695b2b37652b64df758vboxsync return true;
bec052941a2aeb2a3d3bb695b2b37652b64df758vboxsync
bec052941a2aeb2a3d3bb695b2b37652b64df758vboxsync if (!begin(uOption, cch))
bec052941a2aeb2a3d3bb695b2b37652b64df758vboxsync return false;
bec052941a2aeb2a3d3bb695b2b37652b64df758vboxsync put(rStr.c_str(), cch);
d6a533c77fa274df5ee0e592c6abfa73549f2b34vboxsync return true;
bec052941a2aeb2a3d3bb695b2b37652b64df758vboxsync }
d6a533c77fa274df5ee0e592c6abfa73549f2b34vboxsync
d6a533c77fa274df5ee0e592c6abfa73549f2b34vboxsync /**
bec052941a2aeb2a3d3bb695b2b37652b64df758vboxsync * Whether we've overflowed.
bec052941a2aeb2a3d3bb695b2b37652b64df758vboxsync *
4c7080424765b6ab6900953b3736e857318a6126vboxsync * @returns true on overflow, false otherwise.
bec052941a2aeb2a3d3bb695b2b37652b64df758vboxsync */
2087cc1f185f94ea367e4bba400e039159e7ec3cvboxsync bool hasOverflowed(void) const
bec052941a2aeb2a3d3bb695b2b37652b64df758vboxsync {
bec052941a2aeb2a3d3bb695b2b37652b64df758vboxsync return m_fOverflowed;
bec052941a2aeb2a3d3bb695b2b37652b64df758vboxsync }
bec052941a2aeb2a3d3bb695b2b37652b64df758vboxsync
bec052941a2aeb2a3d3bb695b2b37652b64df758vboxsync /**
4c7080424765b6ab6900953b3736e857318a6126vboxsync * Adds the terminating END option.
4c7080424765b6ab6900953b3736e857318a6126vboxsync *
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.
4c7080424765b6ab6900953b3736e857318a6126vboxsync *
bec052941a2aeb2a3d3bb695b2b37652b64df758vboxsync * @returns true on success, false on a (previous) overflow.
bec052941a2aeb2a3d3bb695b2b37652b64df758vboxsync */
bec052941a2aeb2a3d3bb695b2b37652b64df758vboxsync bool optEnd(void)
bec052941a2aeb2a3d3bb695b2b37652b64df758vboxsync {
bec052941a2aeb2a3d3bb695b2b37652b64df758vboxsync Assert((uintptr_t)(m_pbEnd - m_pbCur) < 4096);
bec052941a2aeb2a3d3bb695b2b37652b64df758vboxsync *m_pbCur++ = RTNET_DHCP_OPT_END;
bec052941a2aeb2a3d3bb695b2b37652b64df758vboxsync return !hasOverflowed();
bec052941a2aeb2a3d3bb695b2b37652b64df758vboxsync }
bec052941a2aeb2a3d3bb695b2b37652b64df758vboxsync};
bec052941a2aeb2a3d3bb695b2b37652b64df758vboxsync
bec052941a2aeb2a3d3bb695b2b37652b64df758vboxsync#endif
bec052941a2aeb2a3d3bb695b2b37652b64df758vboxsync