123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154 |
- // Copyright (C) 2011 Internet Systems Consortium, Inc. ("ISC")
- //
- // Permission to use, copy, modify, and/or distribute this software for any
- // purpose with or without fee is hereby granted, provided that the above
- // copyright notice and this permission notice appear in all copies.
- //
- // THE SOFTWARE IS PROVIDED "AS IS" AND ISC DISCLAIMS ALL WARRANTIES WITH
- // REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
- // AND FITNESS. IN NO EVENT SHALL ISC BE LIABLE FOR ANY SPECIAL, DIRECT,
- // INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM
- // LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE
- // OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
- // PERFORMANCE OF THIS SOFTWARE.
- #include <dhcp/dhcp4.h>
- #include <dhcp/pkt4.h>
- #include <dhcp/iface_mgr.h>
- #include <dhcp4/dhcp4_srv.h>
- #include <asiolink/io_address.h>
- using namespace std;
- using namespace isc;
- using namespace isc::dhcp;
- using namespace isc::asiolink;
- Dhcpv4Srv::Dhcpv4Srv(uint16_t port) {
- cout << "Initialization: opening sockets on port " << port << endl;
- // first call to instance() will create IfaceMgr (it's a singleton)
- // it may throw something if things go wrong
- IfaceMgr::instance();
- /// @todo: instantiate LeaseMgr here once it is imlpemented.
- setServerID();
- shutdown_ = false;
- }
- Dhcpv4Srv::~Dhcpv4Srv() {
- cout << "DHCPv4 server shutdown." << endl;
- }
- bool
- Dhcpv4Srv::run() {
- while (!shutdown_) {
- boost::shared_ptr<Pkt4> query; // client's message
- boost::shared_ptr<Pkt4> rsp; // server's response
- #if 0
- // uncomment this once ticket 1239 is merged.
- query = IfaceMgr::instance().receive4();
- #endif
- if (query) {
- if (!query->unpack()) {
- cout << "Failed to parse incoming packet" << endl;
- continue;
- }
- switch (query->getType()) {
- case DHCPDISCOVER:
- rsp = processDiscover(query);
- break;
- case DHCPREQUEST:
- rsp = processRequest(query);
- break;
- case DHCPRELEASE:
- processRelease(query);
- break;
- case DHCPDECLINE:
- processDecline(query);
- break;
- case DHCPINFORM:
- processInform(query);
- break;
- default:
- cout << "Unknown pkt type received:"
- << query->getType() << endl;
- }
- cout << "Received " << query->len() << " bytes packet type="
- << query->getType() << endl;
- // TODO: print out received packets only if verbose (or debug)
- // mode is enabled
- cout << query->toText();
- if (rsp) {
- rsp->setRemoteAddr(query->getRemoteAddr());
- rsp->setLocalAddr(query->getLocalAddr());
- rsp->setRemotePort(DHCP4_CLIENT_PORT);
- rsp->setLocalPort(DHCP4_SERVER_PORT);
- rsp->setIface(query->getIface());
- rsp->setIndex(query->getIndex());
- cout << "Replying with:" << rsp->getType() << endl;
- cout << rsp->toText();
- cout << "----" << endl;
- if (rsp->pack()) {
- cout << "Packet assembled correctly." << endl;
- }
- #if 0
- // uncomment this once ticket 1240 is merged.
- IfaceMgr::instance().send4(rsp);
- #endif
- }
- }
- // TODO add support for config session (see src/bin/auth/main.cc)
- // so this daemon can be controlled from bob
- }
- return (true);
- }
- void
- Dhcpv4Srv::setServerID() {
- /// TODO implement this for real once interface detection (ticket 1237)
- /// is done. Use hardcoded server-id for now.
- #if 0
- // uncomment this once ticket 1350 is merged.
- IOAddress srvId("127.0.0.1");
- serverid_ = boost::shared_ptr<Option>(
- new Option4AddrLst(Option::V4, DHO_DHCP_SERVER_IDENTIFIER, srvId));
- #endif
- }
- boost::shared_ptr<Pkt4>
- Dhcpv4Srv::processDiscover(boost::shared_ptr<Pkt4>& discover) {
- /// TODO: Currently implemented echo mode. Implement this for real
- return (discover);
- }
- boost::shared_ptr<Pkt4>
- Dhcpv4Srv::processRequest(boost::shared_ptr<Pkt4>& request) {
- /// TODO: Currently implemented echo mode. Implement this for real
- return (request);
- }
- void Dhcpv4Srv::processRelease(boost::shared_ptr<Pkt4>& release) {
- /// TODO: Implement this.
- cout << "Received RELEASE on " << release->getIface() << " interface." << endl;
- }
- void Dhcpv4Srv::processDecline(boost::shared_ptr<Pkt4>& decline) {
- /// TODO: Implement this.
- cout << "Received DECLINE on " << decline->getIface() << " interface." << endl;
- }
- boost::shared_ptr<Pkt4> Dhcpv4Srv::processInform(boost::shared_ptr<Pkt4>& inform) {
- /// TODO: Currently implemented echo mode. Implement this for real
- return (inform);
- }
|