// These are hardcoded parameters. Currently this is a skeleton server that only
// grants those options and a single, fixed, hardcoded lease.
-const std::string HARDCODED_LEASE = "10.3.2.222"; // assigned lease
+const std::string HARDCODED_LEASE = "192.0.2.222"; // assigned lease
const std::string HARDCODED_NETMASK = "255.255.255.0";
const uint32_t HARDCODED_LEASE_TIME = 60; // in seconds
-const std::string HARDCODED_GATEWAY = "10.3.2.2";
-const std::string HARDCODED_DNS_SERVER = "8.8.8.8";
-const std::string HARDCODED_DOMAIN_NAME = "isc.example.org";
-const std::string HARDCODED_SERVER_ID = "10.3.1.1";
+const std::string HARDCODED_GATEWAY = "192.0.2.1";
+const std::string HARDCODED_DNS_SERVER = "192.0.2.2";
+const std::string HARDCODED_DOMAIN_NAME = "isc.example.com";
+const std::string HARDCODED_SERVER_ID = "192.0.2.1";
Dhcpv4Srv::Dhcpv4Srv(uint16_t port) {
cout << "Initialization: opening sockets on port " << port << endl;
}
void Dhcpv4Srv::appendDefaultOptions(boost::shared_ptr<Pkt4>& msg, uint8_t msg_type) {
+ boost::shared_ptr<Option> opt;
// add Message Type Option (type 53)
- boost::shared_ptr<Option> opt;
std::vector<uint8_t> tmp;
tmp.push_back(static_cast<uint8_t>(msg_type));
opt = boost::shared_ptr<Option>(new Option(Option::V4, DHO_DHCP_MESSAGE_TYPE, tmp));
msg->addOption(opt);
+ // DHCP Server Identifier (type 54)
+ opt = boost::shared_ptr<Option>
+ (new Option4AddrLst(DHO_DHCP_SERVER_IDENTIFIER, IOAddress(HARDCODED_SERVER_ID)));
+ msg->addOption(opt);
+
// more options will be added here later
}
-boost::shared_ptr<Pkt4>
-Dhcpv4Srv::processDiscover(boost::shared_ptr<Pkt4>& discover) {
- boost::shared_ptr<Pkt4> offer = boost::shared_ptr<Pkt4>
- (new Pkt4(DHCPOFFER, discover->getTransid()));
-
+void Dhcpv4Srv::appendRequestedOptions(boost::shared_ptr<Pkt4>& msg) {
boost::shared_ptr<Option> opt;
- copyDefaultFields(discover, offer);
+ // Domain name (type 15)
+ vector<uint8_t> domain(HARDCODED_DOMAIN_NAME.begin(), HARDCODED_DOMAIN_NAME.end());
+ opt = boost::shared_ptr<Option>(new Option(Option::V4, DHO_DOMAIN_NAME, domain));
+ msg->addOption(opt);
+ // TODO: Add Option_String class
- appendDefaultOptions(offer, DHCPOFFER);
+ // DNS servers (type 6)
+ opt = boost::shared_ptr<Option>
+ (new Option4AddrLst(DHO_DOMAIN_NAME_SERVERS, IOAddress(HARDCODED_DNS_SERVER)));
+ msg->addOption(opt);
+}
- // TODO: Implement actual lease assignment here
- offer->setYiaddr(IOAddress(HARDCODED_LEASE));
+void Dhcpv4Srv::assignLease(boost::shared_ptr<Pkt4>& msg) {
+ boost::shared_ptr<Option> opt;
- // DHCP Server Identifier (type 54)
- opt = boost::shared_ptr<Option>
- (new Option4AddrLst(DHO_DHCP_SERVER_IDENTIFIER, IOAddress(HARDCODED_SERVER_ID)));
- offer->addOption(opt);
+ // TODO: Implement actual lease assignment here
+ msg->setYiaddr(IOAddress(HARDCODED_LEASE));
// IP Address Lease time (type 51)
opt = boost::shared_ptr<Option>(new Option(Option::V4, DHO_DHCP_LEASE_TIME));
opt->setUint32(HARDCODED_LEASE_TIME);
- offer->addOption(opt);
+ msg->addOption(opt);
// Subnet mask (type 1)
opt = boost::shared_ptr<Option>
(new Option4AddrLst(DHO_SUBNET_MASK, IOAddress(HARDCODED_NETMASK)));
- offer->addOption(opt);
+ msg->addOption(opt);
// Router (type 3)
opt = boost::shared_ptr<Option>
(new Option4AddrLst(DHO_ROUTERS, IOAddress(HARDCODED_GATEWAY)));
- offer->addOption(opt);
+ msg->addOption(opt);
+}
- // Domain name (type 15)
- vector<uint8_t> domain(HARDCODED_DOMAIN_NAME.begin(), HARDCODED_DOMAIN_NAME.end());
- opt = boost::shared_ptr<Option>(new Option(Option::V4, DHO_DOMAIN_NAME, domain));
- offer->addOption(opt);
- // TODO: Add Option_String class
+boost::shared_ptr<Pkt4>
+Dhcpv4Srv::processDiscover(boost::shared_ptr<Pkt4>& discover) {
+ boost::shared_ptr<Pkt4> offer = boost::shared_ptr<Pkt4>
+ (new Pkt4(DHCPOFFER, discover->getTransid()));
- // DNS servers (type 6)
- opt = boost::shared_ptr<Option>
- (new Option4AddrLst(DHO_DOMAIN_NAME_SERVERS, IOAddress(HARDCODED_DNS_SERVER)));
- offer->addOption(opt);
+ boost::shared_ptr<Option> opt;
+
+ copyDefaultFields(discover, offer);
+ appendDefaultOptions(offer, DHCPOFFER);
+ appendRequestedOptions(offer);
+
+ assignLease(offer);
return (offer);
}
boost::shared_ptr<Option> opt;
copyDefaultFields(request, ack);
-
appendDefaultOptions(ack, DHCPACK);
+ appendRequestedOptions(ack);
// TODO: Implement actual lease assignment here
ack->setYiaddr(IOAddress(HARDCODED_LEASE));
- // DHCP Server Identifier (type 54)
- opt = boost::shared_ptr<Option>
- (new Option4AddrLst(DHO_DHCP_SERVER_IDENTIFIER, IOAddress(HARDCODED_SERVER_ID)));
- ack->addOption(opt);
-
// IP Address Lease time (type 51)
opt = boost::shared_ptr<Option>(new Option(Option::V4, DHO_DHCP_LEASE_TIME));
opt->setUint32(HARDCODED_LEASE_TIME);
opt = boost::shared_ptr<Option>(new Option4AddrLst(DHO_ROUTERS, IOAddress(HARDCODED_GATEWAY)));
ack->addOption(opt);
- // Domain name (type 15)
- vector<uint8_t> domain(HARDCODED_DOMAIN_NAME.begin(), HARDCODED_DOMAIN_NAME.end());
- opt = boost::shared_ptr<Option>(new Option(Option::V4, DHO_DOMAIN_NAME, domain));
- ack->addOption(opt);
- // TODO: Add Option_String class
-
- // DNS servers (type 6)
- opt = boost::shared_ptr<Option>
- (new Option4AddrLst(DHO_DOMAIN_NAME_SERVERS, IOAddress(HARDCODED_DNS_SERVER)));
- ack->addOption(opt);
-
return (ack);
}